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


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.


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.



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% *.


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.