Windows toplu iş dosyaları% * yapısına sahip mi?


Yanıtlar:


10

Windows toplu iş dosyaları (Windows XP'den beri, ancak muhtemelen daha önce) %*,% 1'den sonraki tüm parametreleri değerlendiren yapıyı destekler .

Ne yazık ki, bu SHIFTkomut onurlandırılmaz , bu nedenle aşağıdakiler işe yaramaz:

@echo off
set EATEN=%1
shift

call other.bat %*

Yine de ilk parametreyi ikinci toplu iş dosyasına geçirir.


2
Not: %*boşluk / tırnak işaretlerini korur.
Aaron Digulla

10

Tüm argümanları aşağıdaki gibi bir şey kullanarak bir araya getirebilirsiniz:

set args=%1
shift
:start
if [%1] == [] goto done
set args=%args% %1
shift
goto start

:done
(use %args% here)

Bu, kaç argüman olduğuna bakılmaksızın çalışır.



1

Evet onlar yapar.

Örneğinizi aşağıdaki gibi yazabilirsiniz:

@echo off
call other.bat %*

Ayrıca: vardiya pencerelerde desteklenmektedir ... Bkz bu .
Ancak, bu son bağlantı, vardiya işleminin% * ile birlikte çalışmadığını doğrular:

• ile% * Kullanımı vardiya
  Shift hiçbir% * toplu parametre üzerinde etkisi yoktur.


Üzgünüm bağlantılar kötüydü ... düzeltilmeli.
fretje

(quote) Shift ile% * kullanmanın% * batch parametresi üzerinde hiçbir etkisi yoktur. (/ quote)
Wedge

Neden inişli çıkışlı? Soru, kayma ile ilgili değil, yaklaşık% * idi.
fretje

İlk cevabınızda sadece bariz bir bağlantı (ya da cevap) olmayan "Evet yaparlar" vardı. Son düzenlemeniz çok daha iyi bir cevap, belki de bu yüzden ...
thijs

Aslında daha fazla açıklama ekledikten sonra downvote oldu. Ve kabul ediyorum "Evet," bağlantı açık değildi, ama eldeki soruya kesin bir cevap oldu ...
fretje

0
@echo off
cls
setlocal enabledelayedexpansion

:: Disable the display of information by changing [set "_ENABLE_INFO="] to [set "_ENABLE_INFO=::"].
set "_ENABLE_INFO="
set _DBQ="

set "_PARMS.ORIGINAL=%*" && if defined _PARMS.ORIGINAL (
   if not defined _PARMS.IDX (
      echo Parameter Index^(es^) to extract eg.:
      echo 1 2 5 9 11 39 400
      set /p "_PARMS.IDX=>"
   )
   set "_PARMS.IDX=¡!_PARMS.IDX: =¡ ¡!¡"
   set "_PARMS.IDX=!_PARMS.IDX:¡¡=!"
   set "_PARMS.IDX=!_PARMS.IDX: =!"
   call :_FN_PROC.STRING %*
%_ENABLE_INFO% goto :FINISH
   goto :eof
) else (
   echo No input parameters.
)
goto :eof


:_FN_PROC.STRING
set "_PARMS.PROCESS.STRING=%*"
:_FN_PROC.STRING.LOOP
set "_PARMS.PROCESS.STRING=!_PARMS.PROCESS.STRING:%_DBQ%=¡!"
set /a _PARMS.COUNT+=1
for /f "tokens=1* delims= " %%a in ("!_PARMS.PROCESS.STRING!") do (
   set _PARMS.TMP.CHECK=%%a
   set _PARMS.PROCESS.STRING=%%b
   if "!_PARMS.TMP.CHECK!" NEQ "!_PARMS.TMP.CHECK:¡=!" (
      for /f "tokens=1* delims=¡" %%c in ("%%a !_PARMS.PROCESS.STRING!") do (
         set _PARMS.TMP.CHECK="%%c"
         set _PARMS.PROCESS.STRING=%%d
      )
   )
)

if "!_PARMS.IDX:¡%_PARMS.COUNT%¡=!" EQU "!_PARMS.IDX!" (
   set _PARMS.REMAINING=!_PARMS.REMAINING! !_PARMS.TMP.CHECK!
   set _PARMS.IDX=!_PARMS.IDX!{%_PARMS.COUNT%}
) else (
   set _PARMS.EXTRACTED=!_PARMS.EXTRACTED! !_PARMS.TMP.CHECK!
   set _PARMS.IDX=!_PARMS.IDX:¡%_PARMS.COUNT%¡=!
   set _PARMS.IDX=!_PARMS.IDX![%_PARMS.COUNT%]
)

if "!_PARMS.PROCESS.STRING: =!"=="" (set _PARMS.PROCESS.STRING=)
if defined _PARMS.PROCESS.STRING (goto :_FN_PROC.STRING.LOOP)

set _DBQ=
set _PARMS.TMP.CHECK=
if defined _PARMS.REMAINING (set _PARMS.REMAINING=!_PARMS.REMAINING:~1!)
if defined _PARMS.EXTRACTED (set _PARMS.EXTRACTED=!_PARMS.EXTRACTED:~1!)
goto :eof


:FINISH
echo.
echo _PARMS.IDX ^:
echo    ¡^=¡ no Parameter Index was specified for extraction.
echo    ¡n¡ nth Parameter was not processed (Index larger than Parameters Count).
echo    [n] nth Parameter was Extracted.
echo    {n} nth Parameter was Ignored (Remaining).
echo.
set _
goto :eof

Tüm özel sınırlayıcıları korur. Komut satırı sınırı başına 8175 karaktere sığabilecek sayıda Parametreyi destekler (belirtilmişse toplu dosya adı, CRLF ve toplu işlem yolu dahil). Parametreler çift tırnak ile gruplandırılabilir (örn. "Sw1 = / quiet / skip: 1 / start = 3"). Not: Çift tırnaklar korunur. Çift tırnak davranışı beklenir (yanlış kullanılsa bile, örneğin tek başına veya "" veya "" kullanılır). Lütfen hata raporu vermeden önce kodda hata ayıklayın.
Dharma Leonardi

Bu, orijinal soruyu doğrudan cevaplamasa da, çok sayıda hata ayıklama bilgisini gösteren çok ayrıntılı bir cevaptır: call other.batverilen parametrelerle nasıl yapılır :( "other.bat" yazabilir miyim? Çıkarmak için "Parametre dizin (ler) i kaldırmak mümkün mü "sorgu? Ayrıca, clsnihai çözüm gerekli değildir.
izogfif
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.