Usuń argument z% *

1

W partii systemu Windows chciałbym usunąć jeden lub więcej konkretnych argumentów z% *

Na przykład chcę usunąć --dev z polecenia takiego jak to:

python --dev -c "print 'hello world'"

Jak bym to zrobił?

@ECHO OFF
setlocal enabledelayedexpansion

set i=0
for %%x in (%*) do (
  IF NOT %%x == --dev (
     set /A i+=1
     set "args[!i!]=%%~x"
     )
)
:: expecting args to be -c "print 'hellow world'"
echo running: python %args%
python %args%
Asi Sudai
źródło

Odpowiedzi:

1

Wygląda na to, że próbujesz emulować notację tablicową w swojej partii, co nie działa. W zasadzie tworzysz nowe zmienne, takie jak:

args[0]=--dev

z którym musiałbyś wtedy zadzwonić %args[0]%.

Zmienna wymiana treści

Zamiast tego możesz użyć zastępowania zmiennych w następujący sposób:

@ECHO OFF

set args=%*
set args=%args:--dev =%

:: expecting args to be -c "print 'hello world'"
echo running: python %args%
python %args%

W ten sposób nie potrzebujesz opóźnionego rozszerzenia lub for pętle.

for pętla

Jeśli wolisz zachować swoje for możesz użyć czegoś takiego:

@ECHO OFF
setlocal enabledelayedexpansion

set args=
for %%x in (%*) do (
  IF NOT [%%x] == [--dev] (
     set "args=!args! %%x"
     )
)
:: expecting args to be -c "print 'hello world'"
echo running: python %args%
python %args%

Dalsza lektura:

Worthwelle
źródło
1
Dobra odpowiedź, ale nie widzę sensu w używaniu args[] zmienne. Dlaczego nie zacząć set "args= ", następnie w pierwszej pętli po prostu set "args=!args! %%~x, bez potrzeby drugiej pętli? Łańcuch argumentu będzie miał dwa początkowe spacje, które będą ignorowane w linii harmonogramu programu.
AFH
Słuszna uwaga. Nie jestem pewien, dlaczego mam ten oryginał for pętla utknęła mi w głowie. Zaktualizowałem odpowiedź za pomocą twoich sugestii. Nie użyłem %%~x ponieważ to usuwa niezbędne cytaty z argumentów.
Worthwelle
Tak, nie miałem pewności, czy cytaty powinny być uwzględnione: tylko dlatego, że pytający wykluczył ich, że zrobiłem to samo, chociaż moim instynktem było ich włączenie.
AFH