BAT-файл, анализирующий и передающий все параметры его командной строки вызываемой программе

Использоваться, например, может, если программа где-то глубоко зарыта в недрах Program Files, имя самой программы длинное и некузявое, а добавлять ее каталог в PATH бессмысленно или лень.

В таком случае можно написать подобный BAT-файл:

@Echo Off
Setlocal EnableDelayedExpansion
Set P=
For %%A In (%*) Do SET P=!P! %%~A

"C:\Program Files\somesoftware\soft.exe" %P%

Пример

@Echo Off
Setlocal EnableDelayedExpansion
Set P=
For %%A In (%*) Do SET P=!P! %%~A

echo %P%

Как работает

При вызове, например с такими параметрами:
test1.bat 1 2 34 5 76 blablabla hutinpuilo
выдаст на экран строку
1 2 34 5 76 blablabla hutinpuilo


При использовании переменных окружения в командных файлах существует определенное ограничение, связанное с тем фактом, что присваиваемое значение остается без изменения при его модификации внутри группы команд, задаваемой скобками, например в командах IF или FOR . Для обхода данного ограничения используется запуск командного процессора с параметром /V:ON и вместо знаков процента, для получения принимаемого переменной значения, используются восклицательные знаки. Кроме того, существует возможность использовать стандартный запуск командного процессора, но с локальным включением данного режима командой :

Setlocal EnableDelayedExpansion

Разница в результатах использования значений переменных довольно наглядно демонстрируется следующим командным файлом:

Setlocal EnableDelayedExpansion
@ECHO OFF
set VAR=before
if «%VAR%» == «before» (
set VAR=after
if «!VAR!» == «after» @echo Со знаком процента=%VAR% , Со знаком вопроса=!VAR!
)
Команда set VAR=after выполняется внутри подпрограммы, ограниченной скобками и, если убрать команду Setlocal EnableDelayedExpansion или не использовать для получения значения переменной VAR восклицательные знаки, ее значение останется старым ( тем, что было установлено до входа в подпрограмму ). Аналогичная же проблема наблюдается и тогда, когда значение переменной изменяется внутри цикла команды FOR. Например, для получения списка файлов текущего каталога такой командный файл не будет работать:

set LIST=
for %%i in (*) do set LIST=%LIST% %%i
echo %LIST%

Значение переменной LIST внутри цикла изменено не будет. Для того, чтобы это произошло, командный файл нужно изменить следующим образом:

Setlocal EnableDelayedExpansion
set LIST=
for %%i in (*) do set LIST=!LIST! %%i
echo %LIST%

Теперь, значение переменной LIST внутри цикла FOR будет изменяться, последовательно принимая значения имен файлов, разделенных пробелом ( set LIST=!LIST! %%i)

ССЫЛКИ

Копия BAT-файла на Pastebin
Источник 1 2
SET (справка по команде, копия)

One Response to BAT-файл, анализирующий и передающий все параметры его командной строки вызываемой программе

  1. Pingback: QEMU для Windows XP | Персональный блог Толика Панкова

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*