cmd.exe는 첫 번째 따옴표가 캐럿으로 이스케이프 처리 되더라도 서로 옆에 두 따옴표를 이스케이프 처리합니다.


0

나는 따옴표에 문제가있다, 나는 이것을 몇 시간 동안 해왔다. 나는 기본적으로 외부 프로그램 (FOO)을 가지고 있으며, 처리 할 문자열이 필요하며, 그 문자열 내에 마지막과 마지막에 인용문이있다. .

FOO /f "BAR ^"BAZ^""

이 코드는 'BAZ'가 포함 된 따옴표를 이스케이프 처리 할 때 첫 번째 따옴표가 캐럿으로 이스케이프 처리 된 경우에도 서로 옆에있는 두 따옴표가 이스케이프 처리되므로 마지막 따옴표를 이스케이프 처리하기 때문에 작동하지 않습니다.

나는 그것이 Windows Batch를 엄격하게 사용하기를 원하기 때문에 sed와 같은 것을 사용하고 싶지 않다.

( 편집하다: 내 문제를 재현하는 명령은 다음과 같습니다.

REG ADD HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run /t REG_SZ /v Update /d "cmd.exe /c ""echo CreateObject(""Wscript.Shell"").Run """""""" ^& WScript.Arguments(0) ^& """""""", 0, False > invis.vbs && CALL invis.vbs update.bat""" /f

)


여기에 설명 된대로 여러 개의 큰 따옴표를 사용하십시오. stackoverflow.com/questions/7760545/...
Axel Kemper

@AxelKemper 불행히도 나는 그것을 사용할 때 작동시키지 못한다. REG ADD <KEYNAME> /t REG_SZ /v FOO /d "BAR ""BAZ""" /f. 그것은 잘못된 구문을 말합니다.
Linus

2 단계 접근법을 시도해 보셨습니까? 먼저 cmd.exe ...의 출력을 env 변수 foo에 쓰고 두 번째는 reg 명령에서 % foo %를 사용하여 출력합니까?
DavidPostill

@DavidPostill 당신은 무엇을 의미합니까?
Linus

긴 명령을 두 개의 명령으로 나눈다는 뜻입니다.
DavidPostill

답변:


2

나는 작은 것을 썼다. C 실제로 전달 된 것을 알아 내기위한 프로그램 cmd.exe

#include "stdafx.h"

int main(int argc, char **argv)
{
    for (int i = 0; i < argc; i++)
    {
        printf("\n%d: '%s'\n", i, argv[i] ? argv[i] : "<null>");
    }
    return 0;
}

요구:

consoleapplication1 ADD KEYNAME /t REG_SZ /v FOO /d "BAR ""BAZ""" /f

프로그램에 도착한 매개 변수 :

0: 'consoleapplication1'

1: 'ADD'

2: 'KEYNAME'

3: '/t'

4: 'REG_SZ'

5: '/v'

6: 'FOO'

7: '/d'

8: 'BAR "BAZ"'

9: '/f'

작은 따옴표는 설명을 위해 추가 된 것입니다.

결론 :
중복 큰 따옴표는 예상대로 작동합니다.

노트 :
REG 설명 된대로 특수 이스케이프 문자로 백 슬래시를 사용합니다. 이리 .


고맙습니다. 실제 명령으로 시도했지만 비슷한 결과를 얻었습니다. 그러나 이상한 이유로 reg 명령은 다음 명령으로 지정된 명령을 사용하여 성공하지 못합니다. /d, 그러나 내 안쪽 따옴표를 사용하지 않으면 작동합니다. 어떤 아이디어? (편집 참조)
Linus

2

출처 구문 : 이스케이프 문자, 구분 기호 및 따옴표

특수한 상황들

적은 수의 명령은 약간 다른 규칙 인 FINDSTR, REG 및 RUNAS 모두 사용 \ 이스케이프 문자 대신 ^

당신이 사용했던 :

REG ADD <KEYNAME> /t REG_SZ /v FOO /d "BAR ^"BAZ^"" /f

대신 다음을 시도하십시오.

REG ADD <KEYNAME> /t REG_SZ /v FOO /d "BAR \"BAZ\"" /f

추가 테스트를 많이 한 후에, 나는이 작업을했습니다, 고마워요!
Linus

큰! 이 질문을하는 모든 향후 사용자가 마침내 작업을 수행하기 위해 수행 한 작업을 정확하게 알려줄 수 있다면 유용 할 것입니다.
DavidPostill

글쎄, 내가 REG ADD 명령을 사용하고 많은 특수 문자 (예 : &|<>^ ) 나는 캐럿을 사용하여 이스케이프해야했다. 그렇지 않으면 내 특정 명령이 망가질 것이고 '& gt;'를 사용하면 파일에 REG ADD의 출력을 추가하려고 시도 할 것이다. ^로 이스케이프하지 않고 문자. 하지만 특수 문자를 캐럿으로 이스케이프 처리했을 때 작동했습니다.
Linus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.