我正在尝试通过 powershell 创建计划任务,以运行另一个 powershell 脚本,该脚本将每天调用许多其他脚本。
直接/手动从 Powershell 运行这些脚本中的任何一个时,都没有问题 - 每个脚本都执行其功能,没有任何问题。
但是,尽管如此,当尝试运行该任务时,我遇到了退出代码
0x1
的砖墙。
我对此进行了研究并尝试了多种不同的论点:
-ExecutionPolicy Bypass
开关执行上述操作(在每种变体中)。-File "C:\Test\V2\Master.Script.ps1"
进行上述操作,并将其与 -ExecutionPolicy Bypass
开关结合起来。 "-NonInteractive"
开关。我过去也遇到过这个问题。我发现有效的是使用
BAT File
来调用 ps1 文件。希望这对您的情况有所帮助。
BAT 文件会改变执行策略,然后运行 ps1 文件。 BAT 和 ps1 文件除了文件扩展名外需要命名相同
REG ADD "HKLM\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell" /T REG_SZ /V ExecutionPolicy /D Unrestricted /F
Start PowerShell.exe -Command "& '%~dpn0.ps1'"
这是我用来创建新任务来运行附加 ps1 文件的一些代码。
$Task_Action = New-ScheduledTaskAction -Execute 'PowerShell.exe' -Argument '-File C:\File.ps1'
$Task_Principal = New-ScheduledTaskPrincipal -UserId SYSTEM -RunLevel Highest
$Task_Settings = New-ScheduledTaskSettingsSet -Hidden
$Task_Trigger = New-ScheduledTaskTrigger -AtStartup
Register-ScheduledTask `
-TaskName "Your Task Name" `
-Action $Task_Action `
-Principal $Task_Principal `
-Trigger $Task_Trigger `
-Settings $Task_Settings `
-Force
在最后一个脚本中,我使用
Set-ExecutionPolicy Restricted -Scope LocalMachine
设置了执行策略
我使用@briantist在PowerShell脚本不会作为Windows计划任务执行中的答案解决了这个问题,但我想准确地隔离哪个开关正在解决问题。
它与
-ExecutionPolicy
、-Noninteractive
、-NoLogo
、-NoProfile
或任何其他系统权限、运行脚本的用户帐户等无关。
只需在
-File
字段中的脚本路径前面添加 Task Scheduler > Actions > Arguments
即可。如果没有此开关,PowerShell 将启动并且任务历史记录显示 Action Completed
,但脚本未执行。
上面未提及的其他两个可能的问题:
任务计划程序正在调用 cmd 来运行您的脚本,因此请确保在尝试/调试/故障排除时也从 cmd 调用 powershell。
网络驱动器
当用户未登录时,无法访问网络驱动器,因此我必须替换为全名(例如,我必须用
cd Y:
代替 cd \\server-somewhere.com
)。
如果您在脚本中将目录更改为网络驱动器,这可能就是问题所在。
通过日志记录轻松检查
dir
更改目录后的结果:
cd ...
dir | Out-File myLogFile.txt -Append;