Czy pliki wsadowe systemu Windows mają konstrukcję% *?

10

Czy w pliku wsadowym muszę (np.) Wykonać następujące czynności?

@echo off
call other.bat %1 %2 %3 %4 %5 %6 %7 %8 %9
Roger Lipscombe
źródło
Podobne do $ @ na Unixie
An̲̳̳drew

Odpowiedzi:

10

Pliki wsadowe systemu Windows (od Windows XP, ale być może wcześniej) obsługują %*konstrukcję, która ocenia wszystkie parametry od% 1.

Niestety, to nie honoruje SHIFTpolecenia, więc następujące elementy nie będą działać:

@echo off
set EATEN=%1
shift

call other.bat %*

Nadal przekaże pierwszy parametr do drugiego pliku wsadowego.

Roger Lipscombe
źródło
2
Uwaga: %*zachowuje białe znaki / cudzysłowy.
Aaron Digulla
10

Możesz zebrać wszystkie argumenty razem, używając czegoś takiego:

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

:done
(use %args% here)

Działa to niezależnie od liczby argumentów.

Graeme Perrow
źródło
1

Tak, robią.

Możesz napisać swój przykład w następujący sposób:

@echo off
call other.bat %*

Także: shift jest obsługiwany w systemie Windows ... Zobacz to .
Ale rzeczywiście ten ostatni link potwierdza, że ​​shift nie działa w połączeniu z% *:

• Używanie% * z shift
  Shift nie ma wpływu na parametr wsadowy% *.

fretje
źródło
Przepraszamy, linki były złe ... należy je teraz naprawić.
fretje
(cytat) Używanie% * z przesunięciem Shift nie ma wpływu na parametr wsadowy% *. (/ quote)
Wedge
Dlaczego głosowanie negatywne? Pytanie dotyczyło% *, a nie zmiany.
fretje
Twoja pierwsza odpowiedź zawierała tylko „Tak, robią”, co nie było oczywistym linkiem (ani odpowiedzią). Twoja ostatnia edycja jest bardziej przyzwoitą odpowiedzią, być może dlatego ...
thijs
Właściwie głosowanie miało miejsce po tym, jak dodałem więcej wyjaśnień. I zgadzam się, że link „Tak robią” nie był oczywisty, ale była to dokładna odpowiedź na pytanie…
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
Dharma Leonardi
źródło
Zachowuje wszystkie specjalne ograniczniki. Obsługuje tyle parametrów, ile można zmieścić w znaku 8175 na limit wiersza poleceń (w tym nazwę pliku wsadowego, CRLF i ścieżkę wsadu, jeśli podano). Parametry można pogrupować podwójnymi cudzysłowami (np. „Sw1 = / quiet / skip: 1 / start = 3”). Uwaga: Podwójne cudzysłowy zostają zachowane. Oczekuje się zachowania podwójnych cudzysłowów (nawet jeśli są używane nieprawidłowo, np. Używane tylko pojedynczo lub „” lub „”). Najpierw debuguj kod, zanim zgłosisz błąd.
Dharma Leonardi,
To bardzo skomplikowana odpowiedź pokazująca wiele informacji o debugowaniu, choć nie odpowiada bezpośrednio na pierwotne pytanie: jak to zrobić call other.batz podanymi parametrami :( Gdzie napisać „other.bat”? Czy można usunąć „Indeksy parametrów”, aby wyodrębnić „zapytanie? Również clsnie jest potrzebne w ostatecznym rozwiązaniu.
izogfif