배치 파일에서 앰퍼샌드를 이스케이프 처리하려면 어떻게해야합니까?


146

명령을 사용 start하여 URL에 앰퍼샌드가있는 웹 페이지를 열려면 배치 파일 (또는 Windows 명령 행)에서 앰퍼샌드를 이스케이프 처리하려면 어떻게해야 합니까?

큰 따옴표는 작동하지 않습니다 start. 대신 새 명령 줄 창이 시작됩니다.

업데이트 1 : Wael Dalloul의 솔루션이 작동합니다. 또한 URL에 URL 인코딩 문자 (예 : 공백은 % 20으로 인코딩 됨) 가 있고 배치 파일에 있으면 '%'는 '%%'로 인코딩해야합니다. 이 예에서는 그렇지 않습니다.

예를 들어, 명령 행 ( CMD.EXE)에서 :

start http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8

결과

http://www.google.com/search?client=opera 

기본 브라우저에서 열리고 명령 행 창에서 다음 오류가 발생합니다.

'rls' is not recognized as an internal or external command,
operable program or batch file.
'q' is not recognized as an internal or external command,
operable program or batch file.
'sourceid' is not recognized as an internal or external command,
operable program or batch file.
'ie' is not recognized as an internal or external command,
operable program or batch file.
'oe' is not recognized as an internal or external command,
operable program or batch file.

플랫폼 : Windows XP 64 비트 SP2


1
belugabob의 답변을 편집 했으므로 이제 작동합니다. start생각없이 적용하면 인수 인용이 실패 하는 기발한 것입니다 . 그리고 전반적으로 나는 인수를 따옴표로 묶는 것이 탈출 해야하는 모든 문자를 피하는 것보다 쉽고 오류가 덜 발생한다고 생각합니다.
Joey

무엇에 대한 더하기 기호 +내가 탈출을 앞에 넣어해야하는지?
william

PowerShell을의에서 start "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"작동하기 때문에 PowerShell은에서 따옴표를 제거합니다
phuclv

답변:


91

cmd에서 :

  • &다음과 같이 이스케이프됩니다 : ^&(@Wael Dalloul의 답변을 기반으로 함 )
  • % 탈출 할 필요가 없습니다

예를 들면 :

start http://www.google.com/search?client=opera^&rls=en^&q=escape+ampersand%20and%20percentage+in+cmd^&sourceid=opera^&ie=utf-8^&oe=utf-8

배치 파일에서

  • &다음과 같이 이스케이프됩니다 : ^&(@Wael Dalloul의 답변을 기반으로 함 )
  • %다음과 같이 이스케이프됩니다 : %%(OPs 업데이트 기반)

예를 들면 :

start http://www.google.com/search?client=opera^&rls=en^&q=escape+ampersand%%20and%%20percentage+in+batch+file^&sourceid=opera^&ie=utf-8^&oe=utf-8

또한 "%"를 이스케이프하는 예를 포함 할 수 있습니다. 그러면 질문을 정리할 수 있습니다.
Peter Mortensen

@PeterMortensen 확실히-내 답변을 업데이트했습니다.
Lasse Christiansen

2
어떤 캐릭터도 탈출해야합니까? 나는 "|"을 탈출해야한다는 것을 알아 차렸다 "^ |".
liquide

이 경우 환경 변수 %로 정의하기에 어리석은 사람은 누구 20and입니까? 그럴 경우 대신 start http://www.google.com/search?q=ampersand%20and%20percentage링크 할 수 http://www.google.com/search?q=ampersandsomething-silly20percentage있습니다. ^%cmd에서 이스케이프 처리를 사용 하면 예제가 예상대로 작동합니다.
TamaMcGlinn

145

&명령을 분리하는 데 사용됩니다. 따라서을 ^탈출하는 데 사용할 수 있습니다 &.


3
무엇에 대한 더하기 기호 +내가 탈출을 앞에 넣어해야하는지?
william

이것이보다 일반적인 적용 가능한 솔루션입니다. 명령 행 프로그램의 매개 변수에 하나 이상의 앰퍼샌드가있는 경우에도 작동합니다. 방금이 문제가 발생했습니다-매개 변수는 CGW5COMM & 10C4 & 8301 입니다.
피터 Mortensen

캐럿 문자 ^로 앰퍼샌드를 인용하는 것은 모든 상황에서 작동하지 않는 것 같습니다. 예를 들어, / p : 스위치를 사용하여 msdeploy.exe를 실행하려고하면 앰퍼샌드로 암호를 전달하기 위해 시도한 순열 (캐럿 따옴표, 큰 따옴표, 더미 첫 번째 인수)이 작동하지 않는 것 같습니다.
Derek Greer

3
사용의 예는 ^귀중합니다.
jpmc26

2
@ jpmc26 이 답변에 예제 추가했습니다 .
Lasse Christiansen

29

더미 첫 번째 인수를 제공하면 따옴표로 묶을 수 있습니다.

이 경우 start에는 첫 번째 인수가 인용 된 경우 새 콘솔 창의 제목으로 취급되므로 더미 첫 번째 인수를 제공해야합니다 . 따라서 다음이 작동해야합니다 (여기에서 수행됨).

start "" "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"

좋아, 제목이 내부의 질문과 완전히 일치하지 않는다는 것을 인정합니다. (제목을 더 길게 만들어야한다고 생각하십니까?)
Peter Mortensen

따옴표로 묶는 것이 올바른 아이디어였습니다. 콘솔 창 제목에 대해서는 알지 못했습니다. 감사합니다 Johannes!
belugabob

PowerShell은 인수에서 따옴표를 제거 하므로 실패합니다. start "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"PowerShell 에서만 사용할 필요가 있습니다
phuclv


12

명령

echo this ^& that

예상대로 작동하여 출력

this & that

명령

echo this ^& that > tmp

문자열을 "tmp"파일에 쓰는 것도 가능합니다. 그러나 파이프 전에

echo this ^& that | clip

^는 완전히 다르게 해석됩니다. 두 명령 "echo this"와 "that"의 출력을 파이프에 쓰려고합니다. 에코가 작동하면 "that"이 오류를 발생시킵니다. 속담

echo this ^& echo that | clip

문자열 "this"와 "that"을 클립 보드에 넣습니다.

^없이 :

echo this & echo that | clip

첫 번째 에코는 콘솔에 쓰며 두 번째 에코의 출력 만 클립으로 파이프됩니다 ( "> tmp"리디렉션과 유사). 따라서 출력이 재 지정 될 때 ^는 &를 인용하지 않고 대신 재 지정 이전에 적용되도록합니다.

&를 파이프하려면 두 번 인용해야합니다.

echo this ^^^& that | clip

문자열을 변수에 넣으면

set m=this ^& that

그때

set m

출력합니다

m=this & that

그러나 명백한

echo %m%

Windows가 변수를 대체 한 후

echo this & that

이 명령을 새로운 명령으로 구문 분석하고 "that"을 실행하려고합니다.

배치 파일에서 지연 확장을 사용할 수 있습니다 .

setlocal enableDelayedExpansion
echo !m!

파이프로 출력하려면 변수 값의 모든 & s를 ^ &로 바꿔야합니다. % VAR : FROM = TO % 구문으로 할 수 있습니다 :

echo !m:^&=^^^&! | clip

명령 행에서 "cmd / v"는 확장 지연을 활성화합니다.

cmd /v /c echo !m!

파이프에 쓸 때에도 작동합니다

cmd /v /c echo !m! | clip

단순한.


파이프 솔루션은 효과가 있지만 결론은 다소 틀립니다. Btw. 간단한 것도 echo this ^^^& that | clip작동합니다. 매직 파이프 처리를 이해하려면 다음을 읽을 수 있습니다. 파이프 된 코드 블록 내부에서 확장 지연이 실패하는 이유는 무엇입니까?
jeb

1

echo앰퍼샌드가 포함 된 문자열 이 필요한 경우 따옴표도 출력에 표시되므로 도움이되지 않습니다. 이 경우 다음을 사용하십시오 for.

for %a in ("First & Last") do echo %~a

... 배치 스크립트에서 :

for %%a in ("First & Last") do echo %%~a

또는

for %%a in ("%~1") do echo %%~a

0

경우 이 파일의 이름에 공백이 당신이 문자를 가지고 당신은 탈출해야합니다

작은 AND 따옴표를 사용하여 명령에서 잘못 입력하지 않도록 할 수 있습니다.

scp ./'files name with spaces/internal folder with spaces/"text & files stored.txt"' .

^문자 그렇지 않으면 따옴표를 이스케이프합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.