Muss ich in einer Batch-Datei (z. B.) Folgendes tun?
@echo off
call other.bat %1 %2 %3 %4 %5 %6 %7 %8 %9
Muss ich in einer Batch-Datei (z. B.) Folgendes tun?
@echo off
call other.bat %1 %2 %3 %4 %5 %6 %7 %8 %9
Antworten:
Windows-Batchdateien (seit Windows XP, möglicherweise jedoch früher) unterstützen das %*
Konstrukt, das ab% 1 alle Parameter auswertet.
Leider wird der SHIFT
Befehl dadurch nicht berücksichtigt , sodass Folgendes nicht funktioniert:
@echo off
set EATEN=%1
shift
call other.bat %*
Der erste Parameter wird weiterhin an die zweite Batchdatei übergeben.
%*
Erhält Leerzeichen / Anführungszeichen.
Sie können alle Argumente zusammenfassen, indem Sie Folgendes verwenden:
set args=%1
shift
:start
if [%1] == [] goto done
set args=%args% %1
shift
goto start
:done
(use %args% here)
Dies funktioniert unabhängig davon, wie viele Argumente es gibt.
Wenn Sie beispielsweise die ersten drei Parameter überspringen und den Rest weitergeben möchten:
@echo off
for /f "tokens=1-3*" %%a in ("%*") do (
set par1=%%a
set par2=%%b
set par3=%%c
set therest=%%d
)
call other.bat %therest%
Möglicherweise treten Probleme mit Anführungszeichen in Parametern auf.
Ein großes Lob an Patrick Cuff, /programming/382587/how-to-get-batch-file-parameters-from-nth-position-on
Sie können Ihr Beispiel wie folgt schreiben:
@echo off
call other.bat %*
Außerdem: Shift wird unter Windows unterstützt ... Siehe hier .
In der Tat bestätigt dieser letzte Link, dass die Verschiebung in Kombination mit% * nicht funktioniert:
• Die Verwendung von% * mit Shift
Shift hat keine Auswirkungen auf den Batch-Parameter% *.
@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
call other.bat
mit den angegebenen Parametern? (( Wo schreibe ich "other.bat"? Ist es möglich, "Parameterindex (e) zum Extrahieren zu entfernen? "Abfrage? Wird auch cls
in der endgültigen Lösung nicht benötigt.