2011-03-08 2 views
6

파이프 및 공백이 포함될 매개 변수를 전달해야하는 배치 파일이 있습니다. 공백 때문에 매개 변수를 전달할 때 큰 따옴표를 매개 변수에 첨부해야합니다. 이중 따옴표를 제거하고 매개 변수를 반향시켜야합니다. 일반적으로 ~를 사용하면이 작업을 수행 할 수 있지만 전달중인 특정 매개 변수에 대한 문제로 인해 문제가 발생한다고 생각합니다.공백, 큰 따옴표, 파이프가있는 일괄 파일 매개 변수

[test1.bat]

call test2.bat "Account|Access Level|Description" 

[test2.bat]

echo %1 
echo %~1 

그리고 실행 test1.bat, 내가 얻을이 출력 :

"Account|Access Level|Description" 
'Access' is not recognized as an internal or external command, operable program or batch file. 
나는 이렇게 할 경우

그래서 큰 따옴표를 제거하고 여전히 사용 가능한 변수가 있습니까?

답변

3

특수 문자를 신경 쓰지 않기 때문에 지연 확장을 사용할 수 있습니다.
유일한 문제는 백분율 확장을 통해 전송할 수 있기 때문에 매개 변수 내용을 변수에 가져 오는 것입니다.
하지만 귀하의 경우에는 이것이 효과가 있습니다.

@echo off 
setlocal DisableDelayedExpansion 
set "str=%~1" 
setlocal EnableDelayedExpansion 
echo !str! 

비고, 지연된 확장을 먼저 비활성화합니다. 및 ^는 %의 팽창에 의해 변형되지 않는 한

편집 : 지연된 확장 비활성화 또는 활성화되면

setlocal DisableDelayedExpansion 
setlocal EnableDelayedExpansion 

활성화 될 수 있고, 그 확장 변수의 다른 방법 (!variable! 대신 추가 %variable%), 변수의 괄호 블록 효과 (set /?에 설명되어 있음)를 방지하기위한 기본 변수입니다.

그러나 지연 확장이 일괄 처리 구문 분석의 마지막 단계이기 때문에 !variable!을 사용하여 확장하면 더 이상 구문 분석의 내용이 금지됩니다.
자세히 설명합니다. how does the windows command interpreter cmd exe parse scripts

+0

그것이 효과가있다! 정말 고맙습니다! 왜 효과가 있었는지 말해 줄 수 있어요? 내가 "지연된 확장"을 비활성화하거나 활성화 할 때 나는 무엇을하고 있습니까? – SuperNES

+0

@SuperNES : 내 게시물을 편집하여 조금 설명합니다. – jeb

+0

어떻게하면 큰 따옴표 하나를 전달할 수 있습니까? 배치 파일을'. \ blah.cmd "asdf" "123"'과 같이 인용하려고 할 때마다,'echo! str! '은 하나가 아닌 두 개의 큰 따옴표를 출력합니다. – binki

1
@echo off 
if "%~2"=="" (
    call %0 "Account|Access Level|Description" dummy 
) ELSE (
    setlocal ENABLEEXTENSIONS 
    for /F "tokens=*" %%A IN ("%~1") DO @echo.%%A 
) 

정확하지는 않지만 작동합니다. 특수 문자를 다루는 것은 배치 파일에서 항상 고통스런 일입니다 ...

+0

어떻게하면 큰 따옴표를 전달할 수 있습니까? 내가 ('. \ play2.cmd "와"b ""c "dummy'로) 시도 할 때 나는 두 개의 큰 따옴표를 1 대신에 울린다. – binki

관련 문제