使用 PowerShell 创建包含空格的计划任务

Using PowerShell To Create Scheduled Task With Spaces

提问人:Christopher Cass 提问时间:4/26/2023 更新时间:4/27/2023 访问量:121

问:

我有两个脚本用作应用程序安装的一部分。第一个脚本创建一个计划任务,以便在服务器重新启动后运行第二个脚本。脚本的那部分是:

$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

PowerShell 计划任务 报价

评论


答:

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