Одиночные кавычки в команде schtasks
Я пытаюсь использовать SCHTASKS для создания запланированного задания в Windows. Параметры включают одинарные кавычки. Если я создаю свою задачу вручную, она работает. В графическом интерфейсе планировщика задач Windows "Сведения" (на вкладке действия) отображаются следующим образом:
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
Затем это появляется в графическом интерфейсе (обратите внимание на интерпретацию одинарной кавычки двойной кавычке на первом, но не на втором экземпляре:
powershell (New-Object System.Net.WebClient).DownloadString ("http://mywebserver/myscript.ps1\') | powershell.exe -noprofile -
Я пытался избежать его и т. Д. (Который отлично работает для двойных кавычек, но не для одинарных), но не могу понять это..?!
Заранее большое спасибо за любые предложения.
6 ответов
Я наткнулся на ту же проблему в последнее время.
Мне нужно было добавить действие в задачу с помощью этой команды:
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\\\`"))\`""
Это, по сути, еще один уровень выхода из кавычек: кавычки необходимо экранировать обратным трюком.
Моя голова начинает кружиться, но я рад, что приручил зверя:)
PowerShell использует неудачный обратный удар (`) в качестве escape-символа. Обратная косая черта не имеет особого значения. Еще лучше, малоизвестный трюк, используйте -%.
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, запустите его и передайте все, что следует после" -% ", ТОЧНО как есть".
Основываясь на подходе XML, если вам действительно нужны одинарные кавычки в последнем аргументе задачи, моим обходным решением было создать задачу без аргументов, требующих одинарных кавычек, затем экспортировать задачу XML (/query /xml /tn), удалить задачу ( / delete / tn /f), обновите XML-файл с помощью аргументов и создайте снова (/ create / xml). Определенно окольный путь, но единственный способ заставить его работать
Использование /XML-ключа schtasks.exe - еще один способ обойти эту проблему; в зависимости от ваших потребностей, вам может понадобиться создать XML-файл на лету. Я просто создал задачу вручную, экспортировал ее, адаптировал xml-файл и изменил строку schtasks с /TR на /XML.
Следующее может дать вам то, что вам нужно. Но он будет запускаться как одна команда, а не как команда с аргументами.
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
Тогда я бы предложил сделать это вместо:
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-путь, необходимы соответствующие разрешения.