背景:
需做一個這樣小腳本:啓動監控windows某個東西狀態變化,用powershell啓動可以,但使用cmd bat掉用無法生效。
問題 :
做個簡單實驗:
如下一段最簡單powershell的腳本, 命名爲tmp.ps1:
echo "start ps1" >tmp.txt sleep 100 echo "end ps1" >>tmp.txt
按照windows官方說法,後臺任務使用Start-Job運行,官方文檔見:https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/start-job?view=powershell-7.3
我們打開powershell 運行 如下命令:
start-job -FailPath tmp.ps1
再通過get-job查看,可以看到腳本已在後臺運行,如下:
到這,是不是感覺後臺任務穩穩後,沒問題。
但問題來了, 我想通過bat腳本調用ps1來後臺運行。寫下面的腳本:
echo "start bat" powershell -command "start-job -Failpath tmp.ps1" echo "end bat"
從理論上看,會調用tmp.ps1後臺運行,但是呢:
看起來在運行,結果我們再次打開powshell輸出get-job查看,該後臺任務無法找到....
再次翻閱官方法說,有這麼一段話:
start-job只能適用於當前的session.也就是說不能想linux一樣,真正放在後臺運行。雞肋的功能
解決方案:
那麼有沒有好的解決方法呢,有:那就是將腳本放在計劃任務中,然後再去調用計劃任務 run,步驟如下:
-->
然後在需要時,使用來調用
schtasks.exe /Run /TN tmp
參考文檔: