Windows 배치 파일의 구성이 % *입니까?


답변:


10

Windows 배치 파일 (Windows XP 이후는 가능하지만 이전 버전) %*은 % 1부터 모든 매개 변수로 평가 되는 구문을 지원합니다 .

불행히도 이것은 SHIFT명령을 존중하지 않으므로 다음과 같이 작동하지 않습니다.

@echo off
set EATEN=%1
shift

call other.bat %*

여전히 첫 번째 매개 변수를 두 번째 배치 파일로 전달합니다.


2
참고 : %*공백 / 따옴표를 유지합니다.
Aaron Digulla

10

다음과 같은 방법으로 모든 인수를 수집 할 수 있습니다.

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

:done
(use %args% here)

얼마나 많은 인수가 있는지에 관계없이 작동합니다.


2

예를 들어 처음 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


1

그렇습니다.

다음과 같이 예제를 작성할 수 있습니다.

@echo off
call other.bat %*

또한 : shift는 windows에서 지원됩니다 ... 이것을 참조 하십시오 .
그러나 실제로 마지막 링크는 % *와 함께 시프트가 작동하지 않음을 확인합니다.

• 함께 * %를 사용 시프트
  시프트 것은 아니오 % * 배치 매개 변수에 영향을 미치지 않습니다.


죄송합니다. 링크가 잘못되었습니다. 지금 수정해야합니다.
fretje 2016 년

(quote) Shift와 함께 % *를 사용하면 Shift *는 % * 배치 매개 변수에 영향을 미치지 않습니다. (/ quote)
Wedge

왜 공감해야합니까? 문제는 전환에 관한 것이 아니라 % *에 관한 것이었다.
fretje 2016 년

첫 번째 답변에는 "그렇습니다"만 있었으며 이는 분명한 링크 (또는 답변)가 아닙니다. 당신의 마지막 편집은

실제로 downvote는 더 많은 설명을 추가 한 후에 발생했습니다. 그리고 나는 "그렇습니다"에 대한 링크가 분명하지 않다는 것에 동의하지만, 그것은
당면한

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

모든 특수 분리 문자를 유지합니다. 명령 줄 제한 당 8175 자 (배치 파일 이름, CRLF 및 지정된 경우 배치 경로 포함) 당 최대 개수의 매개 변수를 지원합니다. 매개 변수는 큰 따옴표로 묶을 수 있습니다 (예 : "sw1 = / quiet / skip : 1 / start = 3"). 참고 : 큰 따옴표는 유지됩니다. 큰 따옴표의 동작이 예상됩니다 (예 : 잘못 사용 된 경우에도 (예 : 단독으로 또는 ""또는 ""만 사용))). 버그 보고서를 작성하기 전에 먼저 코드를 디버그하십시오.
Dharma Leonardi

그것은 call other.bat주어진 질문에 직접 대답하지는 않지만 많은 디버그 정보를 보여주는 매우 정교한 대답입니다 : 주어진 매개 변수 를 사용 하는 방법 : ( "other.bat"를 어디에 쓰나요? "질문? 또한 cls최종 솔루션에는 필요하지 않습니다.
izogfif
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.