% * İçindeki bir argümanı kaldır


1

Windows toplu işinde, bir veya daha fazla belirli bağımsız değişkeni% * içinden kaldırmak istiyorum

Örneğin, --dev komutunu böyle bir komuttan kaldırmak istiyorum:

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

Bunu nasıl yaparım?

@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%

Yanıtlar:


1

İşleminizdeki dizi gösterimini taklit etmeye çalışıyorsunuz, ki bu gerçekten işe yaramıyor. Temelde yaptığınız şey gibi yeni değişkenler oluşturmaktır:

args[0]=--dev

hangi sonra aramanız gerekir %args[0]%.

Değişken içerik değişimi

Bunun yerine, değişken değişimini şöyle kullanabilirsiniz:

@ECHO OFF

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

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

Bu şekilde gecikmeli genişleme veya fordöngüler gerekmez .

for döngü

forDöngününüzü korumayı tercih ederseniz , bunun gibi bir şey kullanabilirsiniz:

@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%

Daha fazla okuma:


1
İyi bir cevap, ama args[]değişkenleri kullanma noktasında anlamıyorum . Neden set "args= "ilk döngüde set "args=!args! %%~xikinci döngü için gerek kalmadan başlıyorsunuz ? Argüman dizesinde, program çizelgesi satırında göz ardı edilecek iki önde gelen boşluk olacaktır.
AFH,

İyi bir nokta. O orijinal fordöngüyü neden kafama soktuğumdan emin değilim . Cevabını önerilerinle değiştirdim. Ben kullanmadım %%~xçünkü argümanlardaki gerekli alıntıları kaldırıyor.
Worthwelle

Evet, tekliflerin dahil edilip edilmemesi gerektiğinden emin değildim: içgüdülerim bunları içermekle birlikte, yalnızca sorgulayıcının aynı şeyi yaptığımı dışladığı içindi.
AFH
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.