Фильтрация аргументов в пакетном файле Windows - PullRequest
1 голос
/ 09 февраля 2011

Можно ли отфильтровать список аргументов в пакетном файле Windows?

Предполагается, что он называется как:

file.cmd arg1 --unwanted arg3

Он должен вызывать какой-то другой исполняемый файл (жестко закодированный) без строки аргумента --unwanted:

some.exe arg1 arg3

Я знаю только имя аргумента, его можно передать как любой аргумент в списке. Он может не существовать в списке аргументов, и все аргументы должны передаваться без изменений. Количество аргументов может варьироваться.

Дополнительные примеры (что называется -> что следует называть в результате)

file.cmd arg1 arg2 -> some.exe arg1 arg2
file.cmd --unwanted -> some.exe
file.cmd --unwanted arg2 -> some.exe arg2
file.cmd arg1 --unwanted -> some.exe arg1

Переход от командных файлов Windows к сценариям оболочки для меня - черная магия:)

1 Ответ

3 голосов
/ 09 февраля 2011
@echo off
setlocal ENABLEEXTENSIONS

if "%1"=="SOTEST" (
    REM tests...
    call file.cmd arg1 --unwanted arg3
    call file.cmd arg1 arg2
    call file.cmd --unwanted
    call file.cmd --unwanted arg2
    call file.cmd arg1 --unwanted
    goto :EOF
)

set params=
:nextparam
if "%~1"=="--unwanted" (shift&goto nextparam)
if not "%~1"=="" (set "params=%params%%1 "&shift&goto nextparam)

echo.%*^>^>%params%

Это печатает:

arg1 --unwanted arg3>>arg1 arg3
arg1 arg2>>arg1 arg2
--unwanted>>
--unwanted arg2>>arg2
arg1 --unwanted>>arg1

Редактировать:

@echo off
setlocal ENABLEEXTENSIONS

if "%~1"=="SOTEST" (
    REM tests...
    call file.cmd arg1=foo --unwanted arg3=bar
    call file.cmd arg1 arg2
    call file.cmd --unwanted
    call file.cmd --unwanted arg2
    call file.cmd arg1 --unwanted
    call file.cmd "arg1" --unwanted "arg3"
    call file.cmd "arg1=foo" --unwanted arg3="bar"
    goto :EOF
)

set var=0
set params=
:nextparam
set /A var=%var% + 1
for /F "tokens=%var% delims= " %%A in ("%*") do (
    if not "%%~A"=="--unwanted" set "params=%params%%%A "
    goto nextparam
)

echo.%*^>^>%params%

печатает

arg1=foo --unwanted arg3=bar>>arg1=foo arg3=bar
arg1 arg2>>arg1 arg2
--unwanted>>
--unwanted arg2>>arg2
arg1 --unwanted>>arg1
"arg1" --unwanted "arg3">>"arg1" "arg3"
"arg1=foo" --unwanted arg3="bar">>"arg1 foo" arg3="bar"

значение "arg1 = foo "не работает, вы можете переключить цикл for на for /F "tokens=%var% delims= " %%A in ('echo.%*') do (, чтобы он заработал, но это нарушает arg1 = foo и arg3 =" bar "

Это известная проблема с пакетными файлами, однаждывы начинаете возиться со строками, в некоторых конфигурациях все облажается, потому что всегда есть какой-то персонаж, который все испортит (%,!, ", ^, &, |, <,>, пробел и т. д.)

...