假设我有一个myScript.ps1
文件,有时需要运行本机命令/二进制文件。其内容是:
set-content -path "c:\temp\test.text" -value "hello world"
. 'C:\temp\myCliTool.exe'
如果我手动在任务计划程序中创建一个任务并将“操作”选项卡设置为
- 程序/文件
"C:\Program Files\PowerShell\7\pwsh.exe"
- 论据
-NoProfile -ExecutionPolicy Bypass -command "& {. 'C:\temp\myScript.ps1'}"
ps1 脚本运行良好,test.txt
文件已创建。此外,它执行任务所需的本机命令也运行
但是,如果我再次通过任务计划程序但在“操作”选项卡中运行相同的脚本,请稍作更改:
- 程序/文件
"C:\Program Files\PowerShell\7\pwsh.exe"
- 论据
-NoProfile -ExecutionPolicy Bypass -file 'C:\temp\myScript.ps1'
脚本似乎没有运行。test.txt
文件未创建。此外,本机命令也不会运行。
如果我尝试通过其他方式(例如 cmd)运行 pwsh,则不会出现此问题。
我认为任务调度程序在这里有问题。我花了一整天时间修复它的“功能”,例如 Path Env 变量在任务调度程序调用下不可用。试图找出 pwsh-file
调用的问题已无济于事,我尝试将 PowerShell 脚本中可能发生的潜在错误重定向到文本文件,但我无法完全弄清楚。
我在使用 pwsh 7.4 和 Windows 11
在Windows 上的无 shell调用上下文(例如任务计划程序)中,唯一可识别的引用形式是
"..."
(双引号),而不是'...'
(单引号)。[1]因此,替换:
和:
注意:假设您的特定文件路径不包含空格,您也可以不带引号地传递它。
引用起作用的唯一原因
'...'
如下:是使用PowerShell (Core) 7 CLI
-Command
的参数pwsh.exe
,这会导致其封闭参数的值"..."
被解释为 PowerShell 代码,其中'...'
引用被识别。相比之下,
-File
- 不涉及将其参数解释为 PowerShell 代码 - 仅接受"..."
-enclosed 参数作为文件路径,并且类似地,仅识别"..."
对任何后续传递参数的引用。有关何时使用
-Command
vs. 的一般指导-File
,请参阅此答案。另外:
"& { ... }"
来调用通过-Command
(-c
) 参数传递给 PowerShell 的 CLI 的代码 - 只需"..."
直接使用。旧版本的CLI 文档错误地建议这& { ... }
是必需的,但后来已更正。[1] 这同样适用于来自 的呼叫
cmd.exe
。