在 PowerShell 中將一個 .ps1 檔案註冊為 Windows 服務有幾種方法和工具可以實現。這裡列舉了幾種常見的方法:

suv789發表於2024-07-25

在 PowerShell 中將一個 .ps1 檔案註冊為 Windows 服務有幾種方法和工具可以實現。這裡列舉了幾種常見的方法:

1. 使用 New-Service Cmdlet (適用於 PowerShell 5.1+)

如果你的 PowerShell 版本是 5.1 及以上,並且只需簡單地將一個 .ps1 檔案作為服務執行,可以使用 New-Service cmdlet。

powershellCopy Code
New-Service -Name "MyService" -BinaryPathName "C:\Path\To\powershell.exe -ExecutionPolicy Bypass -File C:\Path\To\YourScript.ps1" -Description "Description of your service"
  • -Name: 指定服務的名稱。
  • -BinaryPathName: 指定服務的二進位制路徑,這裡是 PowerShell 的路徑及引數。確保在 -File 引數後面提供你的 .ps1 指令碼的完整路徑。
  • -Description: 可選,指定服務的描述。

2. 使用 NSSM (Non-Sucking Service Manager) http://www.nssm.cc/download GitHub - kirillkovalenko/nssm: Non-Sucking Service Manager GitHub - dkxce/NSSM: The Non-Sucking Service Manager

NSSM 是一個第三方工具,可以將任何可執行檔案包括 PowerShell 指令碼註冊為 Windows 服務。

  1. 下載 NSSM: 首先從 NSSM 官網 下載適合你係統架構的版本。
  2. 安裝服務: 使用 NSSM 安裝服務,並指定 PowerShell 及其引數。
cmdCopy Code
nssm install YourServiceName "C:\Path\To\powershell.exe" "-ExecutionPolicy Bypass -File C:\Path\To\YourScript.ps1"

3. 使用 PowerShell Studio 或其他第三方應用

一些整合開發環境(IDE)如 PowerShell Studio 提供了建立和管理 Windows 服務的圖形介面選項。這些工具通常會簡化服務的建立和管理流程,特別是在需要更復雜的配置或與服務相關的其他設定時。

注意事項:

  • 確保在安裝或註冊服務時,設定適當的執行策略(如 -ExecutionPolicy Bypass)以避免 PowerShell 指令碼執行時的許可權問題。
  • 在註冊服務時,要確保路徑和引數設定正確,並根據實際需要調整描述和其他配置選項。

選擇合適的方法取決於你的具體需求和環境,每種方法都有其優缺點。


4. 使用 sc.exe (Service Control)

sc.exe 是 Windows 自帶的命令列工具,可以用來建立和管理服務。雖然不直接支援 PowerShell 指令碼,但你可以建立一個批處理檔案(.bat 或 .cmd),在其中呼叫 PowerShell 並執行你的指令碼。

  1. 建立一個批處理檔案(例如 run.ps1.bat)如下所示:

    Copy Code
    @echo off
    PowerShell.exe -ExecutionPolicy Bypass -File "C:\Path\To\YourScript.ps1"
  2. 使用 sc.exe 註冊服務,指定該批處理檔案作為服務的可執行檔案:

    Copy Code
    sc.exe create YourServiceName binPath= "C:\Path\To\run.ps1.bat"

    這樣就可以將批處理檔案作為服務執行,間接實現將 PowerShell 指令碼註冊為服務。

5. 使用 srvany.exe (Windows Server Resource Kit)

srvany.exe 是 Windows Server 資源工具包中的一個實用程式,允許將任何可執行程式註冊為服務。雖然它不直接支援 PowerShell 指令碼,但你可以將 PowerShell 作為引數傳遞給 srvany.exe,間接實現將 PowerShell 指令碼作為服務執行。

  1. 首先,安裝 Windows Server 資源工具包(如果尚未安裝)並獲取 srvany.exe

  2. 使用以下命令將 srvany.exe 安裝為服務,並指定 PowerShell 及其引數:

    cmdCopy Code
    sc.exe create YourServiceName binPath= "C:\Path\To\srvany.exe"
    sc.exe config YourServiceName start= auto
    reg add "HKLM\SYSTEM\CurrentControlSet\Services\YourServiceName\Parameters" /v Application /t REG_SZ /d "PowerShell.exe -ExecutionPolicy Bypass -File C:\Path\To\YourScript.ps1"

    這個方法透過註冊 srvany.exe 服務,並在登錄檔中配置 PowerShell 指令碼的路徑來實現服務的執行。

注意事項:

  • 在選擇使用 sc.exesrvany.exe 時,需要特別注意路徑和引數設定,確保服務能夠正確啟動和執行。
  • 這些方法通常需要管理員許可權來安裝和管理服務,確保在執行命令時具備足夠的許可權。
  • 在使用第三方工具或資源包時,務必確認其與當前作業系統版本的相容性,以及安全性問題。

選擇適合你需求和環境的方法並進行測試,以確保服務能夠按預期執行和管理。


6. 使用 Task Scheduler (任務計劃程式)

雖然不是直接註冊為服務,但你可以使用 Windows 的任務計劃程式來定期執行 PowerShell 指令碼,實現類似服務的功能。這種方法的好處是可以利用任務計劃程式的靈活性和管理功能。

  1. 開啟任務計劃程式(Task Scheduler)並建立一個新的任務。
  2. 在任務設定中,配置觸發器(例如啟動時、特定時間或事件等)和操作(指定執行 PowerShell 指令碼的操作)。
  3. 在操作中,配置 PowerShell 並指定要執行的指令碼檔案路徑。

7. 使用 PowerShell Module (如 PSWindowsService)

有一些第三方 PowerShell 模組(如 PSWindowsService)可以簡化建立和管理服務的過程。這些模組通常提供了更高階的功能和管理選項,適合需要更復雜操作的場景。

  1. 安裝 PSWindowsService 模組:

    powershellCopy Code
    Install-Module -Name PSWindowsService
  2. 使用 PSWindowsService 模組建立服務:

    powershellCopy Code
    Import-Module PSWindowsService
    New-Service -Name "MyService" -DisplayName "My PowerShell Service" -BinaryPathName "C:\Path\To\powershell.exe -ExecutionPolicy Bypass -File C:\Path\To\YourScript.ps1"

    PSWindowsService 模組提供了更多選項,如自定義描述、啟動型別、依賴項等。

8. 使用 WinSW (Windows Service Wrapper)GitHub - winsw/winsw: A wrapper executable that can run any executable as a Windows service, in a permissive license.

WinSW 是一個開源的 Windows 服務包裝器,它允許你將任何可執行檔案作為 Windows 服務執行,包括 PowerShell 指令碼。

  1. 下載 WinSW 並配置 XML 檔案以定義服務行為和引數。
  2. 在 XML 檔案中,指定 PowerShell 及其引數以執行你的指令碼。

這些方法提供了多樣的選擇,根據具體需求和環境選擇合適的方式。每種方法都有其特點和適用場景,可以根據需要進行選擇和調整。


9. 使用 NSSM (Non-Sucking Service Manager)http://www.nssm.cc/download GitHub - kirillkovalenko/nssm: Non-Sucking Service Manager

NSSM 是一個開源的第三方工具,允許將任何可執行檔案包裝為 Windows 服務,包括 PowerShell 指令碼。

  1. 下載 NSSM 並解壓縮到一個目錄。

  2. 使用以下命令將 PowerShell 指令碼註冊為服務:

    cmdCopy Code
    nssm install YourServiceName "C:\Path\To\powershell.exe" "-ExecutionPolicy Bypass -File C:\Path\To\YourScript.ps1"

    這樣就可以透過 NSSM 將 PowerShell 指令碼包裝成服務,並且可以配置服務的各種選項和引數。

10. 使用 PowerShell 自帶的 ServiceManagement 模組

PowerShell 本身提供了 ServiceManagement 模組,可以用於建立和管理 Windows 服務。雖然沒有直接支援 PowerShell 指令碼的功能,但可以利用這個模組建立一個佔位服務,並在其啟動指令碼中執行 PowerShell 指令碼。

  1. 首先匯入 ServiceManagement 模組(如果沒有匯入):

    powershellCopy Code
    Import-Module ServiceManagement
  2. 建立一個新的佔位服務,然後在服務的啟動操作中執行 PowerShell 指令碼。

這種方法相對複雜,需要在服務管理的基礎上進行自定義和調整。

注意事項:

  • 在選擇以上任何方法時,都要確保理解其安全性和適用性,尤其是涉及到許可權和指令碼執行策略的問題。
  • 對於每種方法,都需要測試和驗證服務的行為,確保它們按預期工作並且能夠穩定執行。

根據具體情況和需求,選擇最合適的方法來將 PowerShell 指令碼註冊為 Windows 服務。


11. 使用 WinSW (Windows Service Wrapper)GitHub - winsw/winsw: A wrapper executable that can run any executable as a Windows service, in a permissive license.

WinSW 是一個開源的 Windows 服務包裝器,可以將任何可執行檔案,包括 PowerShell 指令碼,作為 Windows 服務來執行。

  1. 下載 WinSW 並解壓到一個目錄。

  2. 配置 XML 檔案以定義服務的行為和引數,包括指定 PowerShell 以及指令碼路徑。

    例如,可以建立一個 XML 檔案 myservice.xml,內容如下:

    xmlCopy Code
    <service>
      <id>MyService</id>
      <name>My PowerShell Service</name>
      <description>This service runs a PowerShell script.</description>
      <executable>powershell.exe</executable>
      <arguments>-ExecutionPolicy Bypass -File "C:\Path\To\YourScript.ps1"</arguments>
      <logmode>rotate</logmode>
    </service>
  3. 使用 WinSW 啟動服務:

    cmdCopy Code
    winsw install

    這將安裝並啟動定義在 XML 檔案中的服務。

12. 使用 sc.exe (Service Control)

Windows 提供了 sc.exe 命令列工具,可以用來建立和管理 Windows 服務。

  1. 開啟命令提示符(以管理員許可權執行)。

  2. 使用 sc.exe 命令建立服務:

    cmdCopy Code
    sc create MyService binPath= "powershell.exe -ExecutionPolicy Bypass -File C:\Path\To\YourScript.ps1"

    這將建立一個名為 MyService 的服務,其執行路徑為指定的 PowerShell 指令碼。

13. 使用 PowerShell Studio 或其他 PowerShell IDE

如果你使用 PowerShell Studio 或其他整合開發環境(IDE),它們通常提供了更友好的介面和功能來建立和管理 Windows 服務。這些工具可以幫助你直觀地配置服務的各種屬性和指令碼執行引數。

透過這些方法,你可以根據自己的偏好和具體需求選擇合適的方式將 PowerShell 指令碼註冊為 Windows 服務,並確保它們能夠穩定執行和方便管理。


14. 使用 Windows PowerShell Desired State Configuration (DSC)

PowerShell DSC 是一種宣告性配置管理工具,可以用來自動化部署和管理軟體環境,包括配置 Windows 服務。你可以編寫 DSC 配置指令碼,將 PowerShell 指令碼作為資源來部署和管理服務。

  1. 建立一個 DSC 配置指令碼,定義服務的配置和其執行的 PowerShell 指令碼。

    powershellCopy Code
    Configuration MyServiceConfig {
        Import-DscResource -ModuleName PSDesiredStateConfiguration
    
        Node localhost {
            Service MyService {
                Name = "MyService"
                StartupType = "Automatic"
                State = "Running"
                Path = "powershell.exe"
                Arguments = "-ExecutionPolicy Bypass -File C:\Path\To\YourScript.ps1"
            }
        }
    }
    
    # 應用配置
    MyServiceConfig

    執行以上指令碼將會建立並配置一個名為 MyService 的服務,其執行指定的 PowerShell 指令碼。

15. 使用 Task Scheduler(計劃任務)

雖然不是將 PowerShell 指令碼直接註冊為服務,但可以使用 Windows 的任務計劃程式(Task Scheduler)來定期執行指令碼。這種方法適合那些不需要持續執行的任務或者需要按時間表執行的任務。

  1. 開啟任務計劃程式(Task Scheduler)。

  2. 建立一個新的基本任務,配置觸發器和操作。

  3. 在操作中指定 PowerShell 指令碼的路徑和執行策略。

    這樣,任務計劃程式會在指定的時間或事件觸發時執行 PowerShell 指令碼。

注意事項:

  • 每種方法都有其適用的場景和限制,例如 DSC 更適合於環境配置和自動化管理,而 Task Scheduler 更適合於簡單的定時任務。
  • 在選擇方法時,請考慮到服務的需求(如持續性、監控等)以及安全性和管理的複雜性。

根據具體情況和需求,選擇最合適的方法來將 PowerShell 指令碼整合為 Windows 環境中的服務或任務。


16. 使用 NSSM (Non-Sucking Service Manager)http://www.nssm.cc/download GitHub - kirillkovalenko/nssm: Non-Sucking Service Manager

NSSM 是一個開源的 Windows 服務管理器,可以將任何可執行檔案(包括 PowerShell 指令碼)作為 Windows 服務來執行。

  1. 下載 NSSM 並解壓到一個目錄。

  2. 開啟命令提示符(以管理員許可權執行)。

  3. 使用 NSSM 安裝服務:

    cmdCopy Code
    nssm install MyService "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "-ExecutionPolicy Bypass -File C:\Path\To\YourScript.ps1"

    這會建立一個名為 MyService 的服務,使用指定的 PowerShell 指令碼執行。

  4. 啟動服務:

    cmdCopy Code
    nssm start MyService

17. 使用 PowerShell 自帶的 ServiceManagement 模組

PowerShell 5.0 引入了 ServiceManagement 模組,可以使用其中的 cmdlet 將指令碼作為服務安裝和管理。

  1. 確保你的 PowerShell 版本支援 ServiceManagement 模組(PowerShell 5.0 及以上)。

  2. 使用以下命令安裝服務:

    powershellCopy Code
    # 安裝服務
    New-Service -Name "MyService" -BinaryPathName "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Bypass -File C:\Path\To\YourScript.ps1" -DisplayName "My PowerShell Service"
    
    # 啟動服務
    Start-Service -Name "MyService"

這些方法提供了更多的選項來靈活地將 PowerShell 指令碼作為 Windows 服務執行,並且適用於不同的管理需求和環境配置。


18. 使用 WinSW (Windows Service Wrapper)GitHub - winsw/winsw: A wrapper executable that can run any executable as a Windows service, in a permissive license.

WinSW 是一個開源的 Windows 服務包裝器,專門用於簡化將任何可執行檔案(包括 PowerShell 指令碼)轉換為 Windows 服務。

  1. 下載 WinSW 並解壓到一個目錄。

  2. 建立一個 XML 配置檔案,指定你的 PowerShell 指令碼的路徑和引數:

    xmlCopy Code
    <service>
        <id>MyPowerShellService</id>
        <name>My PowerShell Service</name>
        <description>This service runs a PowerShell script.</description>
        <executable>powershell.exe</executable>
        <arguments>-ExecutionPolicy Bypass -File "C:\Path\To\YourScript.ps1"</arguments>
        <logmode>rotate</logmode>
    </service>
  3. 在命令提示符中安裝服務:

    cmdCopy Code
    winsw install
  4. 啟動服務:

    cmdCopy Code
    net start MyPowerShellService

19. 使用 FireDaemon Pro

FireDaemon Pro 是一個功能強大的 Windows 服務管理工具,支援將 PowerShell 指令碼作為服務執行,並提供了廣泛的配置選項和管理功能。

  1. 下載和安裝 FireDaemon Pro。

  2. 使用 FireDaemon Pro 的圖形介面或命令列工具配置新服務。

  3. 指定 PowerShell 的可執行檔案路徑和指令碼引數。

    FireDaemon Pro 提供了豐富的配置選項,可以根據需要調整服務的行為、日誌記錄、啟動方式等。

這些方法提供了多種選擇,可以根據具體需求和環境選擇最適合的方法來將 PowerShell 指令碼轉換為 Windows 服務。每種方法都有其獨特的特點和適用場景,使得管理和維護服務更加靈活和便捷。


20. 使用 PowerShell 自定義服務指令碼

你可以編寫一個自定義的 PowerShell 指令碼來建立和管理服務。這種方法需要較多的自定義工作,但提供了更大的靈活性和控制力。

  1. 建立一個 PowerShell 指令碼,用於安裝、啟動和管理服務。例如:

    powershellCopy Code
    # 安裝服務
    function Install-MyService {
        $serviceName = "MyPowerShellService"
        $scriptPath = "C:\Path\To\YourScript.ps1"
        $servicePath = "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"
        $params = "-ExecutionPolicy Bypass -File `"$scriptPath`""
    
        $service = Get-WmiObject -Class Win32_Service -Filter "Name='$serviceName'"
        if ($service -eq $null) {
            New-Service -Name $serviceName -BinaryPathName "$servicePath $params" -DisplayName "My PowerShell Service"
        } else {
            Write-Host "Service already exists."
        }
    }
    
    # 啟動服務
    function Start-MyService {
        $serviceName = "MyPowerShellService"
        Start-Service -Name $serviceName
    }
    
    # 停止服務
    function Stop-MyService {
        $serviceName = "MyPowerShellService"
        Stop-Service -Name $serviceName
    }
    
    # 解除安裝服務
    function Uninstall-MyService {
        $serviceName = "MyPowerShellService"
        Remove-Service -Name $serviceName
    }
    
    # 主程式入口
    Install-MyService

    這個指令碼將 PowerShell 指令碼作為 Windows 服務安裝,並提供了啟動、停止和解除安裝服務的功能。

  2. 在管理員許可權下執行這個指令碼,它將安裝並啟動你的 PowerShell 指令碼作為服務。

21. 使用第三方工具如 AlwaysUp

AlwaysUp 是一個商業化的工具,能夠幫助你將任何應用程式(包括 PowerShell 指令碼)作為 Windows 服務執行。它提供了易於使用的圖形介面和豐富的配置選項,適合需要更多功能和支援的場景。

  1. 下載和安裝 AlwaysUp。
  2. 使用圖形介面新增一個新的應用程式服務,並指定 PowerShell 可執行檔案的路徑和指令碼引數。
  3. 設定服務的啟動型別、日誌記錄、監控等選項。

AlwaysUp 提供了一種更加使用者友好的方式來管理和監控 PowerShell 指令碼作為服務的執行情況,適合需要更多管理功能和技術支援的環境。

這些方法提供了多種選擇,可以根據具體需求和環境選擇最適合的方式來將 PowerShell 指令碼轉換為穩定和可靠的 Windows 服務。


22. NSSM (Non-Sucking Service Manager)http://www.nssm.cc/download GitHub - kirillkovalenko/nssm: Non-Sucking Service Manager

NSSM 是一個免費的開源工具,可以將任何可執行程式包裝成 Windows 服務,包括 PowerShell 指令碼。

  1. 下載 NSSM 並解壓到一個目錄。

  2. 開啟命令提示符(以管理員許可權執行)。

  3. 使用 NSSM 安裝服務:

    cmdCopy Code
    nssm install MyPowerShellService "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "-ExecutionPolicy Bypass -File \"C:\Path\To\YourScript.ps1\""

    這將建立一個名為 MyPowerShellService 的服務,使用指定的 PowerShell 命令來執行你的指令碼。

  4. 啟動服務:

    cmdCopy Code
    net start MyPowerShellService

NSSM 提供了一種簡單而有效的方法來管理和執行 PowerShell 指令碼作為服務,具有良好的穩定性和靈活性。

23. 使用 Task Scheduler (任務計劃程式)

雖然任務計劃程式通常用於定期執行任務,但你也可以配置它來模擬服務的行為,使 PowerShell 指令碼在系統啟動時自動執行。

  1. 開啟任務計劃程式(Task Scheduler)。

  2. 建立一個新的基本任務,配置觸發器為系統啟動。

  3. 在“操作”選項卡中指定 PowerShell 可執行檔案和引數:

    • 程式/指令碼: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
    • 引數: -ExecutionPolicy Bypass -File "C:\Path\To\YourScript.ps1"
  4. 完成建立任務後,系統啟動時會自動執行你的 PowerShell 指令碼。

儘管這種方法不會直接建立一個真正的服務,但它可以在系統啟動時可靠地執行指令碼,並在需要時啟動和停止指令碼。


相關文章