Я знаю, как запускать командные файлы без окна, благодаря этому вопросу здесь: Запустить .bat-файл в запланированной задаче без окна.
Первый ответ - тот, который я использую. В нем говорится, что для запуска командного файла без окна создайте следующий файл vbs и вместо этого запустите файл vbs.
Dim WinScriptHost
Set WinScriptHost = CreateObject("WScript.Shell")
WinScriptHost.Run Chr(34) & "C:\Scheduled Jobs\mybat.bat" & Chr(34), 0
Set WinScriptHost = Nothing
Мой вопрос в том, можно ли это сделать в одном файле. (каким-то образом объединяя сценарий vbs и сценарий пакетного файла) Для ответа выше потребуется два файла, поскольку файл vbs относится к пакетному файлу. Если это возможно, как это сделать?
В сценарии создайте временный файл и запишите в него командный файл. Затем выполните сценарий из временного файла. По завершении удалите временный файл.
В идеале, запишите временный файл в место, где другие пользователи не могут получить к нему доступ, потому что там есть потенциальное состояние гонки, которое можно использовать для повышения разрешений.
Существует множество методов создания гибридных скриптов, описанных на http://www.dostips.com/forum/viewtopic.php?f=3&t=5543.
Я перечислил несколько способов создания гибридной VBS / партии на https://stackoverflow.com/q/9074476/1012053.
Однако создать гибридный JScript / пакетный код немного проще, поэтому я представлю это решение здесь.
Большинство гибридов сначала выполняют пакетную часть, которая затем выполняет VBS или JScript через CScript. Но в вашем случае вы хотите сначала запустить JScript, который затем запускает пакетный скрипт. Обратите внимание, что в сценарии все еще должен быть .bat
расширение для запуска пакетного сценария. JScript запускается сначала через WScript с //e:jscript
вариант.
Вот простой гибридный сценарий, который должен помочь:
@if (@X)==(@Y) @end /* harmless hybrid line that begins a JScript comment
::************ Batch portion ***********
@echo off
:: Your batch code goes here
exit /b
************ JScript portion ***********/
var objShell = new ActiveXObject("WScript.shell");
objShell.run(WScript.ScriptFullName,0);
Полная командная строка для вашей запланированной задачи должна выглядеть примерно так:
C:\Windows\System32\wscript.exe //e:jscript "C:\Scheduled Jobs\mybat.bat"
Одна особенно приятная особенность этого решения заключается в том, что вы можете запускать пакетный сценарий напрямую, и он будет нормально работать в видимом окне cmd.exe, или вы можете активировать его через WSCRIPT для невидимого выполнения.