2017-11-15 23 views
0

QB64에서 명령 줄을 구문 분석하는 프로그램이 있습니다. COMMAND $ 함수 명령 줄을 반환합니다. 공간을 포함하는 긴 파일 이름을 구문 분석해야합니다.이 파일은 따옴표 안에서 파싱하여 파일 이름과 달라야합니다 ( 공간 없음). 예를 들어, "long filename.ext"QB64에서 명령 줄에 세 개의 따옴표가 필요합니다.

명령 줄에 따옴표가 없을 때 명령 $은 따옴표로 묶을 때 파일 이름이 "filename"과 ""인 경우 이라는 파일 이름을 반환합니다. filename ""둘 다 filename을 반환합니다. 그러나 "" "filename" ""은 따옴표가있는 파일 이름을 반환합니다. 명령 $로 따옴표를 보내려면 다른 방법이 있습니까?

답변

1

QB64는 — 대부분 argv 유사과 argc C++에서 COMMAND$_COMMANDCOUNT 기능을 제공합니다. 인수가없는 COMMAND$은 모든 명령 행 args를 포함하는 단일 문자열을 리턴하지만 QB64는 COMMAND$(i)이 색인 i에서 인수를 문자열로 검색하도록 허용합니다. QB64 위키에 _COMMANDCOUNT entry에서 예 :

limit = _COMMANDCOUNT 
FOR i = 1 TO limit 
    PRINT COMMAND$(i) 
NEXT 

당신은 QB64의 명령 줄 인수를 처리하는 데 사용할 것입니다. 프로그램에 따옴표를 포함하는 명령 줄 인수를 전달하려면 백 슬래시를 사용하여 유지하려는 따옴표를 이스케이프 처리해야 할 수 있습니다.

불행히도 백 슬래시 이스케이프는 완벽하지 않으며 cmd.exe에서 문제를 일으킬 수 있습니다. 이는 주로 파일 경로에 백 슬래시가 사용되기 때문입니다. 이것을 파일 경로의 공백과 결합하면 악몽 같은 명령 인터프리터가 생깁니다. this answer에서, 당신은 프로그램에 적절한 견적을 전달하는 인용 된 문자열 안에 따옴표를 두 번 : 와인의 cmd.exe에서

> program.exe hello world 
hello 
world 

> program.exe hello"" world 
hello (+ empty quoted string) 
world 

> program.exe "hello"" world 
hello" 
world 

> program.exe "hello""" world 
hello" world 

""은 그래서 즉시 연속 따옴표는, 위와 같이 견적 또한 인용 된 문자열을 닫 탈출 다음에 간격을 둔 항목을 현재 인수로 계속 그룹화해야했습니다. Windows 컴퓨터를 실행하고 있지 않기 때문에 Windows 구현에 대해 확신 할 수 없지만 동일한 문제가 발생한다고 생각됩니다.

, 당신은 통과 """filename""" 때문에 : 당신은 인용 된 문자열의 ^" 외부를 사용할 수 있지만, 예를 들어 "에서 ""^" 결과로 자신의 문제가

"  Open quoted string 
""  Escaped double quote, closes quoted string 
filename Concatenated at the end of the first quoted string 
"  Open quoted string, concatenated to filename 
""  Escaped double quote, closes quoted string 

편집

, """처럼 ""^"을 배치 파일에 전달하려면 추가 이스케이프가 ""^^"이어야합니다. 따라서 ^을 사용하면 특히 """""이 제대로 작동하는 경우에는 사용하지 않는 것이 좋습니다. ^ 이스케이프 문자에 대한 정보는 위의 링크 된 대답을 참조하십시오.

또한 백 슬래시와 따옴표가있는 문자열에주의해야합니다.당신이 당신의 프로그램에 단일 인수로 유닉스 계열 인수 'C:/Program Files/"file" name'의 적절한 윈도우 표현을 전달할 수있는 방법을 생각해

> program.exe "C:\Program Files\\""file\"" name" 
C:\Program Files\"file" name 

cmd.exe 설명 :이 "C:\Program Files\\"file\" name"의 명령 줄을 초래

"     Open quoted string 
C:\Program Files\\ Quoted string contents, including escaped \ 
""     Escaped double quote, closes quoted string 
file\    Unquoted string contents, including C escape char 
""     Open quoted string with escaped double quote 
[ ]name    Quoted string contents 
"     Close quoted string 

프로그램에 전달되면 C:\Program Files\"file" name의 경로가 생성됩니다. 물론 이러한 경로는 Windows에서는 불가능합니다 (NTFS 파일 시스템에서는 아닐 수도 있습니다). 그러나 그 점을 보여줍니다. cmd.exe의 인용 규칙과 C 런타임의 인용 규칙 및 백 슬래시 이스케이프 모두를 고려해야합니다 .

+0

좋아요, 인용 부호에서 벗어나기 위해 백 슬래시라고 생각했습니다 .Chrome을 다시 도와 주셔서 감사합니다. – eoredson

+1

배치 파일에서 '^ "를 사용할 수 있지만 대화식 세션에서 ''''(따옴표 붙은 문자열을 따옴표 문자로 시작/끝내기) 또는'' ""'(인용 문자열로 인용 문자열을 끝내고 인용 된 새로운 문자열을 시작하기 위해). 따옴표와 관련하여 여러 가지 탈출 규칙에 관해서. 백 슬래시 이스케이프 및 큰 따옴표와 관련된 몇 가지 사항을 명확히하기 위해 답을 편집했습니다. cmd.exe를 사용할 때는 조심해야합니다. 가능한 경우 다른 명령 인터프리터 인 Bash를 사용하십시오. WSL bash, git-bash 또는 심지어 Cygwin 또는 MSYS의 bash 버전이든 상관 없습니다. –