【问题标题】:Single quotes in schtasks commandschtasks 命令中的单引号
【发布时间】:2014-12-11 14:24:05
【问题描述】:

我正在尝试使用 SCHTASKS 在 Windows 上创建计划任务。 参数包括单引号。如果我手动创建任务,它可以工作。 在 Windows 任务计划程序 GUI 中,“详细信息”(在操作选项卡中)显示如下:

powershell (New-Object System.Net.WebClient).DownloadString ('http://mywebserver/myscript.ps1\') | powershell.exe -noprofile -

但是,当我输入我的 SCHTASKS 命令时...

schtasks.exe /Create /TN "My Task" /TR "powershell (New-Object System.Net.WebClient).DownloadString ('http://mywebserver/myscript.ps1\') | powershell.exe -noprofile -" /SC MINUTE /mo 60 /RL HIGHEST

然后这会出现在 GUI 中(注意在第一个实例中将单引号解释为双引号,而不是在第二个实例中:

powershell (New-Object System.Net.WebClient).DownloadString ("http://mywebserver/myscript.ps1\') | powershell.exe -noprofile -

我尝试过转义它等(这对双引号有效,但对单引号无效)但似乎无法弄清楚..?!

非常感谢您的任何建议。

【问题讨论】:

  • 问题出在schtasks.exe运行时库命令参数解析中。可能没有任何方法可以从命令行执行此操作。尝试改用task scheduler API

标签: windows escaping quotes windows-task-scheduler


【解决方案1】:

我最近偶然发现了同样的问题。

我需要使用此命令向任务添加操作:

 Powershell -NoProfile -ExecutionPolicy Bypass -Command "iex ((New-Object Net.WebClient).DownloadString('https://url/to/script.ps1'))"

完全可以使用此命令手动创建任务,但使用schtasks 命令,显然不可能在任务的参数字段中呈现单引号(至少不能在它前面没有反斜杠,这使它无法使用)。

所以经过一番折腾,我找到了一种使用单引号不使用来指定参数的方法:

Powershell -NoProfile -ExecutionPolicy Bypass -Command "iex ((New-Object Net.WebClient).DownloadString(\"https://url/to/script.ps1\"))"

这也适用于任务管理器...耶!

这需要更多的摆弄,但我手动使用 schtasks 命令(在命令提示符中,而不是在 powershell 中)让它工作,如下所示:

schtasks /Create /TN "My Task Name" /RU SYSTEM /SC DAILY /ST 23:00 /TR "Powershell -NoProfile -ExecutionPolicy Bypass -Command \"iex ((New-Object Net.WebClient).DownloadString(\\\"https://url/to/script.ps1\\\""))\""

是的,这些是 url 周围的三个反斜杠...基本上,引号需要用反斜杠转义,反斜杠需要用另一个反斜杠转义。

现在开始让它在 powershell 中工作......稍后再摆弄,我得出了这个结果:

schtasks /Create /TN "My Task Name" /RU SYSTEM /SC DAILY /ST 23:00 /TR "Powershell -NoProfile -ExecutionPolicy Bypass -Command \`"iex ((New-Object Net.WebClient).DownloadString(\\\`"https://url/to/script.ps1\\\`"))\`""

这基本上是另一层转义:引号需要用反引号转义。

我的头开始旋转,但我很高兴我驯服了这头野兽 :)

【讨论】:

    【解决方案2】:

    PowerShell 使用不幸的反引号 (`) 作为转义字符。反斜杠没有特殊含义。 更好的是,鲜为人知的技巧,使用 --%。

    schtasks.exe --% /F /Create /TN "My Task" /TR "powershell (New-Object System.Net.WebClient).DownloadString('http://mywebserver/myscript.ps1') | powershell.exe -noprofile" /SC MINUTE /mo 60 /RL HIGHEST
    

    这基本上意味着,“亲爱的 PowerShell 解析器,在路径中找到 schtasks.exe,运行它并将 '--%' 之后的任何内容按原样传递。”

    【讨论】:

    • 嗨,不幸的是,这些方法都不起作用。 :( 就像添加任何其他字符一样添加反引号,并且 --% 方法只是错误:“错误:无效的参数/选项 -'--%'。
    • 您没有在 PowerShell 中运行它,是吗?您在 cmd.exe 中运行它。那我的坏。我会回来的;)
    • 是的,抱歉.. 通过批处理添加 schtask(用于 GPO)。感谢您的帮助。
    • 为什么不在策略本身内使用新计划任务? technet.microsoft.com/en-us/library/cc725745.aspx
    • 因为我们的域控制器仍然停留在 2003 模式。
    【解决方案3】:

    那么我建议这样做:

    schtasks.exe /F /Create /TN "My Task" /SC MINUTE /mo 60 /RL HIGHEST /TR "powershell.exe -ExecutionPolicy Bypass -NoProfile -File \\UNC\to\Script.ps1"
    

    并在 .ps1 中执行所有操作。

    请注意,您将以“NT AUTHORITY\SYSTEM”的身份进入该 UNC 路径,因此需要适当的权限。

    【讨论】:

      【解决方案4】:

      以下内容可以满足您的需求。但它将作为单个命令而不是带有 args 的命令运行。

      schtasks.exe /Create /TN "My Task" /TR ""\""powershell (New-Object System.Net.WebClient).DownloadString ('http://mywebserver/myscript.ps1\') "|" powershell.exe -noprofile -\"" /SC MINUTE /mo 60 /RL HIGHEST
      

      【讨论】:

        【解决方案5】:

        使用 schtasks.exe 的 /XML 开关是解决此问题的另一种方法;根据您的需要,您可能需要动态创建 xml 文件。我只是手动创建任务,将其导出,调整 xml 文件并将 schtasks 行从使用 /TR 更改为使用 /XML。

        【讨论】:

          【解决方案6】:

          在 XML 方法的基础上,如果您在最终任务参数中确实需要单引号,我的解决方法是创建不需要单引号的参数的任务,然后导出任务 XML (/query /xml /tn),删除任务 (/delete /tn /f),使用 args 更新 XML 文件并再次创建 (/create /xml)。绝对是环形交叉路口,但我可以让它工作的唯一方法

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-07-26
            • 1970-01-01
            • 2014-01-24
            • 1970-01-01
            • 2015-04-12
            • 2020-10-10
            • 2013-12-05
            相关资源
            最近更新 更多