cmd.exe не завершается при использовании файла .bat

[Контекст: я пытаюсь создать ярлык для файла .bat с относительным путем «Начать в», как примерно описано здесь и здесь.]

cmd.exe поддерживает переключатель /c. Согласно документации, это должно заставить его «выполнить команду и затем завершить работу».

Но похоже, что переключатель игнорируется, когда команда представляет собой .bat файл. Например, если вы создаете ярлык со следующей целью (для обычной команды, отличной от летучей мыши):

C:\Windows\System32\cmd.exe /c "START /d C:\temp\ notepad.exe test.txt"

Все работает как положено: открывается Блокнот и консоль (оболочка) исчезает. Но если вы замените приведенную выше команду файлом .bat, например:

C:\Windows\System32\cmd.exe /c "START /d C:\temp\ C:\test.bat"

(где test.bat содержит только "notepad.exe test.txt") Блокнот открывается, как и раньше, но консоль остается там, как нежелательный друг. Почему? И что еще важнее, как мне заставить его уйти?

ОБНОВЛЕНИЕ: я знаю, что могу использовать wscript, как в этом решении, но затем теряю возможность иметь собственный значок (я застрял со значком .vbs по умолчанию).


person kmote    schedule 05.03.2013    source источник


Ответы (3)


Команда start запускает новый процесс для командного файла. Исходный cmd.exe затем завершается, но оставляет новый процесс, который зависает, потому что ожидает завершения notepad.exe.

Измените содержимое файла bat на:

start "" notepad.exe test.txt

Тогда ваш командный файл не будет ждать выхода блокнота, прежде чем продолжить выполнение.

Еще кое-что попробовать:

C:\Windows\System32\cmd.exe /c "START /d C:\temp\ C:\test.bat & exit"

Ядерный вариант - написать небольшую программу на (скомпилированном) языке по вашему выбору, которая запускает файл .bat и затем завершает работу. Затем вы можете присвоить ему собственный значок и заставить его делать все, что вам нравится.

person Blorgbeard    schedule 05.03.2013
comment
Хм, у меня поведение отличается от того, что вы предлагаете (когда я запускаю блокнот из командной строки, он немедленно возвращается). Но, тем не менее, командный файл в моем сообщении был всего лишь примером. Фактический пакетный файл в производстве на самом деле не находится под моим контролем, поэтому, к сожалению, я не могу его изменить. - person kmote; 06.03.2013
comment
Ах, я вижу, вы правы, когда запускаете его вручную. Тем не менее, если вы запустите командный файл вручную, вы увидите, что блокнот блокирует продолжение командного файла. - person Blorgbeard; 06.03.2013
comment
Хороший момент по поводу запуска командного файла вручную. Ты прав. Кроме того, спасибо за отредактированное предложение, но я уже пробовал это с теми же результатами. - person kmote; 06.03.2013
comment
Ядерный вариант - написать небольшую программу на (скомпилированном) языке по вашему выбору, которая запускает файл .bat и затем завершает работу. Затем вы можете присвоить ему собственный значок и заставить его делать все, что вам нравится. - person Blorgbeard; 07.03.2013

Вы также можете взглянуть на Autoit с http://autoitscript.com в качестве альтернативы пакетной обработке. - команда Run () может делать такие вещи с большей предсказуемостью. Поскольку он создает исполняемый файл, вы можете напрямую связать его с помощью ярлыка. Конечно, вы также можете делать гораздо больше, например запускать от имени другого пользователя, вставлять задержки или обрабатывать ошибки, которые трудно сделать с пакетной обработкой.

Вам не нужен полный комплект, подойдет только папка Aut2EXE из загружаемого файла.

Кстати, создавайте своих бывших без сжатия UPX, так как это приводит к ложным срабатываниям AV.

person Community    schedule 05.03.2013
comment
Это должно быть широко распространено, и сторонние решения не подходят. - person kmote; 06.03.2013

Я немного опоздал, но вот ответ.

В документации для start говорится:

Syntax
START "title" [/D path] [options] "command" [parameters]  

    If command is an internal cmd command or a batch file then the command  
    processor is run with the /K switch to cmd.exe. This means that the  
    window will remain after the command has been run.

Если start используется для выполнения командного файла, открытый экземпляр cmd не закроется.

Вместо этого вы также можете использовать call.
call C:\test.bat

person Marcel Peters    schedule 15.12.2017