Как запустить * .exe / key из .bat в цикле - PullRequest
2 голосов
/ 22 июня 2009

У меня есть структура каталогов:

DIR
|-UNINSTALL.BAT
|-component_name
  |-source
  |-setup.exe
  |-uninst.bat
|-another_component_name
  |-source
  |-setup.exe
  |-uninst.bat
|-yet_another_component_name
  |-source
  |-setup.exe
  |-uninst.bat

и так далее ...

В каждом каталоге, например "component_name", у меня есть setup.exe файл, который устанавливает текущий компонент в компонент палитры в Delphi. uninst.bat содержит только эту строку:

"setup.exe" /uninstall

Так что мне нужно написать UNINSTALL_ALL.bat в DIR, который будет запускать uninst.bat во всех каталогах компонентов.

Заранее спасибо.

Ответы [ 5 ]

2 голосов
/ 22 июня 2009

вы можете сделать это с помощью этой строки:

 for /f %%a in ('dir /b /s uninst.bat') do call %%a

обратите внимание, что '%%' необходимо для пакетных файлов. если вы тестируете это в командной строке, используйте только один '%'

0 голосов
/ 20 августа 2009

Как вы описываете свою проблему, у вас есть только один уровень подкаталогов, и вы всегда вызываете один и тот же пакет из корня. Поэтому:

Uninstall_all.cmd

@echo off
for /F "delims=" %%d in ('dir /b /ad') do cd "%%d"& start /b /w ..\uninstall.bat& cd ..

Должен сделать трюк.

0 голосов
/ 26 июня 2009

Это должно работать:

FOR /F %%a IN ('dir /b /s uninst.bat') DO START /B %%a

если вы хотите, чтобы они ждали друг друга, используйте это:

FOR /F %%a IN ('dir /b /s uninst.bat') DO START /B /WAIT %%a
0 голосов
/ 22 июня 2009

Вы хотите использовать конструкцию for. Примерно так:

for %%i in (component_name another_component_name yet_another_component_name) do %%i\uninst.bat

Двойное экранирование (%%) необходимо, если вы поместите цикл for в командный файл. Если вы просто набираете его в командной строке, используйте только 1%.

Кроме того, вы можете использовать подстановочный знак для сопоставления с именами каталогов, если они следуют некоторому соглашению. Откройте командную строку и запустите «для /?» чтобы увидеть все, что он может сделать ... Я считаю, что есть опция / d для сравнения с каталогами. Это будет выглядеть примерно так:

for /D %%d in (component_*) do %%d\uninst.bat

(очевидно, установите подстановочный знак в соответствии с каталогами компонентов.)

0 голосов
/ 22 июня 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...