2014-01-27 2 views
0

일괄 처리 CMD에서^캐럿 이스케이프가 작동하는 방식을 이해하려고합니다.큰 따옴표 묶음 문자열 redux

'txt.txt" DIR *.*"' is not recognized as an internal or external command, 
operable program or batch file. 

:

CMD.EXE "/C > ^"c:\my text.txt^" DIR C:\*.*" 

대신 내가 오류를 얻을 : "내 text.txt를 \ C"나는 CMD 창에서이 줄을 입력 한 말을하자, 나는 그것을 위해 DIR 목록을 보내 기대 나는이 같은 간단한 할 경우

ECHO "^"^"" 

Expected: """" 
Actual : "^""" 

을 나는 두 번과 같이 인용하려고해도 :

ECHO " "" "" " 

Expected: " " " " 
Actual : " "" "" " 

누군가가 어떻게 작동하는지 그리고 신뢰할 수있는 방법은 명령 줄에서 큰 따옴표를 벗어나는 것일 수 있습니까?

감사합니다.

추가 예 :

않는 이유는이 작품 :

cmd.exe "/C sqlcmd.exe -S.\SQLEXPRESS -E -Q"select suser_name()" > "c:\temp\test 1.txt"" 

그러나 이것은 오류가 있습니다. "지정된 경로를 찾을 수 없습니다" txt 파일을 만들지 않습니다.

cmd.exe "/C "sqlcmd.exe" -S.\SQLEXPRESS -E -Q"select suser_name()" > "c:\temp\test 1.txt"" 

이 경우에는 필요하지 않지만 sqlcmd.exe 명령을 따옴표로 묶으려면 어떻게해야합니까?

또한 즉,

cmd.exe /C "sqlcmd.exe" -S.\SQLEXPRESS -E -Q"select suser_name()" > "c:\temp\test 1.txt" 

다시 한번 감사, 같은 결과 전체 라인에서 따옴표를 제거했습니다.

답변

2

따옴표는 cmd.exe 내의 상태 시스템입니다. 첫 번째 따옴표는 따옴표 의미를 켜고, 다음 따옴표는 꺼지거나 다음 번 역 등을 바꿉니다.

따옴표를 이스케이프 처리하여 따옴표 의미를 켤 수 없습니다.

예를 들어, 인용 문자를 보내드립니다 다음은 탈출하지 않고

echo ^" >test.txt 

을 TEST.TXT하는 문자열 " >test.txt는 단순히 화면에 인쇄됩니다.

불행히도,가 인용 의미를 해제 견적을 탈출 하지 수 있습니다.

예를 들어 문자열 "hello world" >"test.txt"을 화면에 인쇄한다고 가정합니다. 내부 인용 부호를 이스케이프 할 수 없기 때문에 시도한 기법 중 어느 것도 작동하지 않습니다. ^" 양식은 ^을 리터럴로 취급하며 출력은 여전히 ​​파일로 리디렉션됩니다. ""은 적절하게 >을 인용하므로 리디렉션은 없지만 이제는 대신 하나의 인용 부호가 사용됩니다.

두 가지 옵션이 있습니다.

1)

2

echo "hello world" ^>"test.txt" 
인용되지 않은 모든 "독"문자) 탈출이 코드를 있으리라 믿고있어

가에있는 지연 확장 변수에서 리터럴 견적을 숨기기 배치 스크립트. FOR /F ... IN('command') 또는 CMD /C 다루는 경우 지연 확장은 아마도 새로운 CMD.EXE 컨텍스트 내에서 해제되기 때문에이 기술을 사용하면 까다로운 될 수

setlocal enableDelayedExpansion 
set "quote="" 
echo "hello world!quote! >!quote!test.txt" 

참고. 여기


는 원래 명령 /c 후 전체 명령 문자열을 따옴표로 묶어야하지 않는

cmd /c dir c:\*.* ^>"c:\my text.txt" 

참고를 할 수있는 방법이다. 이 경우, 그렇지 않은 것이 더 쉽습니다.


나는 다음과 같이 끝에 새 명령을 기록 할 수 있다고 생각 :

괄호 블록 내에서 사용하는 경우
cmd.exe /C ""sqlcmd.exe" -S.\SQLEXPRESS -E -Q"select suser_name()" > "c:\temp\test 1.txt"" 

, 다음 오른쪽 괄호 이스케이프해야합니다.

(
    cmd.exe /C ""sqlcmd.exe" -S.\SQLEXPRESS -E -Q"select suser_name(^)" > "c:\temp\test 1.txt"" 
) 
+0

답장을 보내 주셔서 감사합니다. 코멘트가 제한된 형식을 허용하기 때문에 위의 추가 예제를 추가했습니다. 나는 당신의 제안을 사용하려했지만 여전히 운이 없다. –

+0

@ Neilw - 나는 내 대답에서 코드를 테스트했고, 모두 작동했다 (나는'setlocal enableDelayedExpansion'을 포함하는 것을 잊어 버렸다 - 편집이 이루어졌다). 수정 된 답변에서 더 복잡한 명령을 수행 할 기회가 없었습니다. – dbenham

+0

@ Neilw - 네, 업데이트 된 질문에 대한 해결책이 있다고 생각합니다. – dbenham

관련 문제