schtasks命令中的单引号

时间:2014-10-16 09:20:33

标签: windows escaping quotes schtasks

我正在尝试使用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 -

我试过逃避等等(这适用于双引号但不适用于单引号)但似乎无法弄明白......?!

非常感谢任何建议。

6 个答案:

答案 0 :(得分:3)

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

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

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

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

所以经过一些小小的讨论后,我找到了一种方法来指定参数而不用使用单引号:

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\\\""))\""

是的,那些是在网址周围的三个反斜杠...基本上,引号需要通过反斜杠转义,反斜杠需要通过另一个反斜杠转义。

现在开始从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\\\`"))\`""

这基本上是另一层转义:报价需要通过反引号进行转义。

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

答案 1 :(得分:1)

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,运行它并将其传递给' - %'确实如此。"

答案 2 :(得分:0)

然后我会建议这样做:

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路径,必须有适当的权限。

答案 3 :(得分:0)

以下内容可以满足您的需求。但它会将它作为单个命令而不是带有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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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