如果以下任務按原樣運行,我無法在系統或應用程式日志中獲取日志條目,在啟動時(重新啟動并檢查日志時)它將成功完成并且不會向應用程式事件日志寫入任何內容。如果我手動運行任務,它會很好地寫入應用程式日志。
Windows 2019 服務器上的 Powershell 5.1:
# objective: log to windows event log at startup without requiring a login
$command = '-ExecutionPolicy Bypass -NonInteractive -NoProfile -Command { Write-EventLog -LogName Application -Source "Application" -EventID 1 -Message "important system startup message" }'
$action = New-ScheduledTaskAction -Execute 'powershell.exe' -Argument "-Command {$command}"
$trigger = New-ScheduledTaskTrigger -AtStartup
$settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -MultipleInstances IgnoreNew -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries
$taskName = "Helpful Task Name"
$description = "Task does helpful things"
Register-ScheduledTask -TaskName $taskName -Action $action -Trigger $trigger -Settings $settings -Description $description -User "NT AUTHORITY\SYSTEM" -RunLevel Highest -Force
更新:正如@Bender The Greatest 所指出的,這與從 comspec 呼叫 powershell 有關,這里的作業是關于語法協調,轉義和引號是主要的罪犯。由于下面的評論沒有現成的答案,我想展示我使用固定代碼的方法,其中包括一個轉義模式,用于將本地構建時變數推送到作業資料中
$script = "Write-EventLog -LogName Application -Source Application -EventID 1 -Message `"[$($env:COMPUTERNAME)\$($env:USERNAME)] important system startup message`""
$command = $script.replace('"','\"')
$action = New-ScheduledTaskAction -Execute 'powershell.exe' -Argument "-ExecutionPolicy Bypass -NonInteractive -NoProfile -Command ""$command"""
$trigger = New-ScheduledTaskTrigger -AtStartup
$settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -MultipleInstances IgnoreNew -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries
$taskName = "Helpful Task Name"
$description = "Task does helpful things"
Register-ScheduledTask -TaskName $taskName -Action $action -Trigger $trigger -Settings $settings -Description $description -User "NT AUTHORITY\SYSTEM" -RunLevel Highest -Force
uj5u.com熱心網友回復:
像這樣修改你的$action定義:
$action = New-ScheduledTaskAction -Execute 'powershell.exe' -Argument "-Command ""$command"""
除非您從 PowerShell 本身中呼叫二進制檔案,否則您不能提供 aScriptBlock作為引數。相反,通過使用兩個雙引號 ( ) 代替您包裹的大括號 () 作為字串引數,使用我在上面所做的字串。powershell -Command powershell"{}$command
外部程式無法傳入 aScriptBlock的原因是在 PowerShell 之外, aScriptBlock不存在。當任務計劃程式執行此操作時,它會將其決議為字串,然后 PowerShell 將處理該決議后的字串。在這種情況下,它會直接定義ScriptBlock并退出而不運行它,因為在這種情況下會呈現大括號,這ScriptBlock在 PowerShell 中的語法上定義了 a。理論上,您可以在前面ScriptBlock加上呼叫運算子 ( &) 并且它應該執行,但是沒有什么意義,因為您可以簡單地使用字串文字來代替。
在ScriptBlockPowerShell 內部作業,因為在 PowerShell 內部,它可以發揮自己的作用,以確保在執行之前將某些型別轉換為它認為合適的字串。在行程啟動之前,它不會成為文字{$command},而是首先呈現為不帶括號的文字字串。操作順序在這里很重要,這就是為什么不能在 PowerShell 之外使用ScriptBlocks的原因。-Command
請記住:正如您所寫的那樣,您的任務不會像您期望的那樣作業。但是,一旦您解決了上述問題,特別是因為您根據問題評論設定了轉錄,這應該為您提供解決計劃任務定義的剩余問題所需的工具。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/453668.html
上一篇:如何使用WindowsMultimedia唯一標識MIDI設備?
下一篇:在CMD中更改Lua命令
