답변:
Windows 배치 파일 (Windows XP 이후는 가능하지만 이전 버전) %*
은 % 1부터 모든 매개 변수로 평가 되는 구문을 지원합니다 .
불행히도 이것은 SHIFT
명령을 존중하지 않으므로 다음과 같이 작동하지 않습니다.
@echo off
set EATEN=%1
shift
call other.bat %*
여전히 첫 번째 매개 변수를 두 번째 배치 파일로 전달합니다.
%*
공백 / 따옴표를 유지합니다.
예를 들어 처음 3 개의 매개 변수를 건너 뛰고 나머지를 전달하려면 다음을 수행하십시오.
@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%
매개 변수에 따옴표에 문제가있을 수 있습니다.
패트릭 커프스에게 조언, https : //.com/questions/382587/how-to-get-batch-file-parameters-from-nth-position-on
다음과 같이 예제를 작성할 수 있습니다.
@echo off
call other.bat %*
또한 : shift는 windows에서 지원됩니다 ... 이것을 참조 하십시오 .
그러나 실제로 마지막 링크는 % *와 함께 시프트가 작동하지 않음을 확인합니다.
• 함께 * %를 사용 시프트
시프트 것은 아니오 % * 배치 매개 변수에 영향을 미치지 않습니다.
@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
주어진 질문에 직접 대답하지는 않지만 많은 디버그 정보를 보여주는 매우 정교한 대답입니다 : 주어진 매개 변수 를 사용 하는 방법 : ( "other.bat"를 어디에 쓰나요? "질문? 또한 cls
최종 솔루션에는 필요하지 않습니다.