2013-03-05 2 views
1

[Контекст. Я пытаюсь создать ярлык для файла .bat с относительным «Путевка в» путь, грубо описал here и here]cmd.exe не прекращается при использовании файла .bat

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

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

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

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

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

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

UPDATE: Я знаю, что могу использовать Wscript, как в this solution, но тогда я потеряю возможность иметь собственный значок (я застрял значок по умолчанию .vbs).

ответ

3

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

Измените содержание летучей мыши файл на:

start "" notepad.exe test.txt 

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

Другое дело, чтобы попробовать:

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

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

+0

Хм, у меня другое поведение, чем вы предлагаете (когда я запускаю блокнот из командной строки, он возвращается немедленно.) Но тем не менее, командный файл в моем сообщении был всего лишь примером. Фактический пакетный файл в производстве на самом деле не под моим контролем, поэтому, к сожалению, я не могу его изменить. – kmote

+1

А я вижу, что вы правы, когда запускаете его вручную. Тем не менее, если вы запускаете командный файл вручную, вы увидите, что блокнот блокирует пакетный файл. – Blorgbeard

+0

См. Мое редактирование, возможно, это сработает для вас, а не – Blorgbeard

1

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

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

BTW, создайте свои exes без сжатия UPX, поскольку это приводит к ложным срабатываниям AV.

+0

Это нужно будет широко распространять, а решения третьих сторон - это не вариант. – kmote

0

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

В documentation для 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

Смежные вопросы