Выполняйте ярлыки ссылок из командного файла и не ждите выхода приложения - PullRequest
6 голосов
/ 26 мая 2011

У меня есть несколько приложений, которые мне, как правило, нужно открывать одновременно, и вместо того, чтобы полагаться только на папку «Автозагрузка», чтобы запускать их одновременно (и поэтому я могу открыть все из них, если некоторые были закрыты в какой-то моментв течение дня) Я создал папку, полную ярлыков, аналогично ссылкам запуска Linux на уровне запуска.Так что в папке у меня есть ссылки быстрого доступа, похожие на:

  • S00 - Outlook.lnk
  • S01 - Блокнот ++. Lnk
  • S02 - Chrome.lnk
  • S03 - Skype.lnk

Я создал командный файл, который будет перебирать все ссылки, соответствующие формату именования, и запускать их.Содержимое этого пакетного файла в настоящее время:

@FOR /F "usebackq delims==" %%f IN (`dir /b "S* - *.lnk"`) DO "%%f"

Он запускает большинство ссылок, которые я пробую, но некоторые запускаются и ждут завершения процесса, тем самым предотвращая открытие других сценариев. Есть ли способ выполнить ярлыки, не дожидаясь выхода процессов из пакетного файла? Или это небыло, и вместо этого мне следует искать решение Powershell?

Things I 'Мы уже пробовали:

  • Изменение содержимого на

    @FOR /F "usebackq delims==" %%f IN (`dir /b "S* - *.lnk"`) DO START /B /I "%%f"
    

    Запускает командную строку в фоновом процессе, но фактически никогда не запускает цель ссылки.

  • Изменение содержимого на

    @FOR /F "usebackq delims==" %%f IN (`dir /b "S* - *.lnk"`) DO %comspec% /k "%%f"
    

    Запускает первую ссылку, но ждет.

Ответы [ 2 ]

7 голосов
/ 26 мая 2011

ответ dcp указал в правильном направлении, попробовав его без флага /B, но это не было решением.Очевидно, START примет первую строку в кавычках, независимо от порядка передаваемых ей параметров, в качестве заголовка нового окна, а не в предположении, что это исполняемый файл / команда.Поэтому, когда процессы START запускались, они имели ярлыки ссылок в качестве заголовка окна, а начальный каталог был рабочим каталогом основного пакетного файла.Поэтому я обновил свой файл до командного файла следующим образом, и он работает:

@FOR /F "usebackq delims==" %%f IN (`dir /b "S* - *.lnk"`) DO START /B /I "TITLE" "%%f"
7 голосов
/ 26 мая 2011

Попробуйте первый способ, но снимите /B с команды START. Таким образом, процесс запустится в новом окне, поэтому он не должен заставлять его ждать.

С / B он запустит процесс в том же окне. Поэтому, если этот процесс по какой-то причине блокируется, вы не получите контроль, пока он не завершится. Например, рассмотрим следующий пакетный файл foo.bat (для этого вам нужна команда sleep, у меня есть cygwin, поэтому он идет с этим):

echo hi
sleep 5

В командной строке, если вы наберете

START /B foo.bat

вы заметите, что управление не вернется в командную строку, пока не закончится сон. Однако, если мы сделаем это:

START foo.bat

тогда управление возвращается немедленно (потому что foo.bat запускается в новом окне), что вам и нужно.

...