특수 문자를 사용하여 명명 된 매개 변수를 배치 스크립트에 전달
명명 된 매개 변수를 일괄 스크립트에 무제한으로 전달할 수 있도록 코드 스 니펫을 찾아 수정했습니다.
배치 파일에서 알 수없는 수의 명령 (매개 변수)에 액세스
모든 위대한 작업을했지만, 지금은 스크립트에 와일드 카드 검사에서 건물 그리고 난이 같은 값을 전달하면 나는 발견 "FILEPATH=C:\tmp\test *.txt"
이 FILEPATH
내 코드에 의해 정의되지 않습니다를. 내가 진짜로 만들지 않았기 때문에 나는 그것이 어떻게 작동하는지 부분적으로 모르고 특수 문자를 허용하도록 수정할 수 있습니다.
다음은 수정에 대한 지침이 필요한 명명 된 매개 변수를 허용하는 코드 스 니펫입니다.
::Set Named Arguments
set argCount=0
for %%x in (%*) do (
set /A argCount+=1
set "argVec[!argCount!]=%%~x"
set %%x
)
최신 정보:
for 루프를로 변경했으며 for /F delims^=^"^ tokens^=* %%x in (%*) do (
이제 WILDCARD로 FILEPATH를 정의하지만 첫 번째 "
인수를 제거한 다음 모든 인수를 한 줄로 만들고 final "
. 아마도 줄 argcount
의 영숫자 위치를 연관 시키기 위해를 사용하는 방법이 필요 set %%x
합니까?
또 다른 생각은 for 루프에 대한 위의 변경이 와일드 카드를 받아들이지 만에 전달 된 모든 매개 변수를 포함하는 단일 long 변수를 생성하기 script.cmd
때문에 아마도 나는 그것을 (long 변수) 다시 루프하고 명명 된 인수를 분할 할 수 있습니다.
최신 정보:
사용 예 :
script.cmd :
@ECHO OFF
CLS
::Set Named Arguments
set argCount=0
for %%x in (%*) do (
set /A argCount+=1
set "argVec[!argCount!]=%%~x"
set %%x
)
ECHO %FILEPATH%
ECHO %VAR%
EXIT /B
test.cmd :
@ECHO OFF
CLS
::Doesn't Work
CALL "C:\tmp\script.cmd" "FILEPATH=C:\tmp\tes*.txt" "VAR=2"
PAUSE
::Works Fine
CALL "C:\tmp\script.cmd" "FILEPATH=C:\tmp\test.txt"
PAUSE
답변
FILEPATH=
매개 변수 로 정의하여 현재 방법을 사용합니다 .
참고 : 이것이 위험한면에서 약간의 추세임을 표현해야합니다. 이유는 입력 변수에 이와 유사한 PATH=Somepath
것이 포함되어 있으면 스크립트가 실행되는 동안 즉각적인 환경이 중단되기 때문입니다. 따라서 전달 될 입력 유형을 확인하십시오.
@echo off & setlocal enabledelayedexpansion
(set "%~1" & set "%~2" & set "%~3" & set "%~4")>nul
set argCount=0
if defined FILEPATH (
for %%x in ("%FILEPATH%") do (
set /A argCount+=1
set "argVec[!argCount!]=%%~x"
echo argVec[!argCount!]
)
echo %FILEPATH%
) else (
echo FILEPATH not defined
)
@Gerhard의 멋진 대답을 기반으로 한 내 전체 솔루션 . 이것은 여전히 "VALUE=KEY"
형식 에서 알 수없는 순서로 무제한의 변수 입력을 허용 하고 FILEPATH
위치 인수를 알지 못하지만 배치에는 사용에만 제한 이 있으므로 처음 9 개 중 하나 %1-->%9
를 처리 / 허용하는 것이 가장 쉽고 / 가장 좋다고 느꼈습니다. FILEPATH
매개 변수. 이것은 BASH와 같은 쉘에서 당연하게 여기는 것들과 BASH가 "뒤에서"하는 일에 대해 정말로 가르쳐주었습니다. 아이디어는 script.cmd
항상 매개 변수가있는 "부모 스크립트"에 의해 호출되기 때문에 와일드 카드 검색을 구축하는 것이 었으며 BASH
최종 사용자가 와일드 카드를 사용할 수 있도록 허용 하기를 원했습니다 .
script.cmd :
@ECHO OFF
CLS
::SET Named Arguments
SET argCount=0
for %%x in (%*) do (
SET /A argCount+=1
SET "argVec[!argCount!]=%%~x"
SET %%x
)
::Wildcards in FilePath?
(SET "%~1" & SET "%~2" & SET "%~3" & SET "%~4" & SET "%~5" & SET "%~6" & SET "%~7" & SET "%~8" & SET "%~9")>nul
SET argCount=0
IF DEFINED FILEPATH (
FOR %%x IN ("%FILEPATH%") DO (
SET /A argCount+=1
SET "argVec[!argCount!]=%%~x"
)
CALL :FindFileWildCard "%FILEPATH%" FILEPATH
) ELSE (
ECHO No "FILEPATH=C:\path\print.doc" Defined!
PAUSE
GOTO:EOF
)
ECHO %FILEPATH%
ECHO %VAR%
ECHO %VAR2%
ECHO %VAR3%
ECHO %VAR4%
ECHO %VAR5%
ECHO %VAR6%
ECHO %VAR7%
ECHO %VAR8%
ECHO %VAR9%
ECHO %VAR10%
GOTO :EOF
::Functions
:FindFileWildCard
::Does Path contain WildCards?
ECHO "%~1" | FIND /i "*" >nul
IF %ERRORLEVEL% EQU 0 (
FOR /F "Tokens=*" %%F IN ('DIR /B /S "%~1"') DO (
SET %2=%%F
EXIT /B
)
)
ECHO "%~1" | FIND /i "?" >nul
IF %ERRORLEVEL% EQU 0 (
FOR /F "Tokens=*" %%F IN ('DIR /B /S "%~1"') DO (
SET %2=%%F
EXIT /B
)
)
EXIT /B
:EOF
test.cmd :
@ECHO OFF
CLS
CALL "C:\tmp\script.cmd" "VAR=VAR" "VAR2=VAR2" "VAR3=VAR3" "FILEPATH=C:\tmp\tmp space\te*.txt" "VAR4=VAR4" "VAR5=VAR5" "VAR6=VAR6" "VAR7=VAR7" "VAR8=VAR8" "VAR9=VAR9" "VAR10=VAR10"
PAUSE
CALL "C:\tmp\script.cmd" "VAR=VAR" "VAR2=VAR2" "VAR3=VAR3" "FILEPATH=C:\tmp\tmp space\test with spa?*.txt" "VAR4=VAR4" "VAR5=VAR5" "VAR6=VAR6" "VAR7=VAR7" "VAR8=VAR8" "VAR9=VAR9" "VAR10=VAR10"
PAUSE
CALL "C:\tmp\script.cmd" "VAR=VAR" "VAR2=VAR2" "VAR3=VAR3" "FILEPATH=C:\tmp\test.txt" "VAR4=VAR4" "VAR5=VAR5" "VAR6=VAR6" "VAR7=VAR7" "VAR8=VAR8" "VAR9=VAR9" "VAR10=VAR10"
PAUSE
결과:
C:\tmp\tmp space\test with space.txt
VAR
VAR2
VAR3
VAR4
VAR5
VAR6
VAR7
VAR8
VAR9
VAR10
Press any key to continue . . .