提问人:Christopher Cass 提问时间:4/26/2023 更新时间:4/27/2023 访问量:121
使用 PowerShell 创建包含空格的计划任务
Using PowerShell To Create Scheduled Task With Spaces
问:
我有两个脚本用作应用程序安装的一部分。第一个脚本创建一个计划任务,以便在服务器重新启动后运行第二个脚本。脚本的那部分是:
$installScript = "$PSScriptRoot\Install.ps1"
schtasks.exe /CREATE /F /TN "Install Application" /RU $taskUser /SC ONLOGON /IT /TR "powershell.exe -ExecutionPolicy Bypass -File $installScript" /RL HIGHEST
这对我来说效果很好,但我只是发现了一个障碍。如果其中包含空格,则计划任务无法找到 Install.ps1 脚本。我发现,如果我在计划任务中编辑参数以在路径周围包含“”,它可以毫无问题地工作。但我不确定如何做到这一点。有人有建议吗?$PSScriptRoot
答:
1赞
mklement0
4/27/2023
#1
在调用时看到的命令中,对于包含空格(或其他 PowerShell 元字符,例如 )的脚本路径,必须将 的值括在
“...”
(双引号)中。powershell.exe
-File
$installScript
{
由于您依靠外引号来扩展(插值)值,因此必须转义需要括起来的嵌入字符。
"..."
$installScript
"
$installScript
`"
(或)必须用于逃生;例如:""
"Nat `"King`" Cole"
结果逐字记录Nat "King" Cole
请参阅概念性about_Quoting_Rules帮助主题。
不幸的是,由于您正在调用外部程序 (),并且由于一个长期存在的错误,额外的转义要求开始发挥作用:
schtasks.exe
在 PowerShell 7.2.x 之前,必须手动转义字符。 目标程序应(也)将其视为转义字符。
\
"
由于 Windows 上存在选择性例外,此问题已在 PowerShell 7.3+ 中修复。
有关详细信息,请参阅此答案。
因此,在您的案例中,您必须将这两种转义机制结合起来,这需要将$installScript
括在 \'“
(原文如此)中,即:\`"$installScript"\`"
# Note: The \-escaping is no longer needed in PS 7.3+
$installScript = "$PSScriptRoot\Install.ps1"
schtasks.exe /CREATE /F /TN "Install Application" /RU $taskUser /SC ONLOGON /IT /TR "powershell.exe -ExecutionPolicy Bypass -File \`"$installScript\`"" /RL HIGHEST
评论