schtasks 命令中的单引号

Posted

技术标签:

【中文标题】schtasks 命令中的单引号【英文标题】:Single quotes in schtasks command 【发布时间】: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。 【参考方案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)。绝对是环形交叉路口,但我可以让它工作的唯一方法

【讨论】:

以上是关于schtasks 命令中的单引号的主要内容,如果未能解决你的问题,请参考以下文章

Linux 命令中的单引号,不加任何参数以及双引号的作用

shell中的单引号和双引号的区别

Shell中的单引号(‘)双引号(”)和反引号(·)

Sed命令忽略Groovy脚本中的单引号

ksh88将heredocs中的单引号更改为双引号?

shell中的单引号,双引号,反引号