배치 스크립팅이 처음입니다. 변수에 할당 할 명령의 출력이 필요합니다. FOR / F 명령에 대해 알게되었습니다. 내 명령에는 공백과 큰 따옴표가 있습니다. 그래서 usebackq 옵션을 사용해 보았습니다. 그러나 공간상의 오류로 실패합니다.
for /F "usebackq delims=" %%G IN (`"C:\Program Files (x86)\ABC\DEF\XYZ.exe" Get /a "P1=D2" /b "Q1=D3" /c "D5"`) DO (
SET var=%%G
)
ECHO %var%
pause
실패 :
'C:\Program' is not recognized as an internal or external command,
operable program or batch file.
StackOverflow에 대한 다른 질문에 따라 나는 모든 것을 올바르게했습니다 -back tick의 usebackq , demlims = 구분 기호로 공백을 무시합니다. 왜 여전히 실패하는지 잘 모르겠습니다. 도움을 주시면 감사하겠습니다!
사용중인 내부 '
또는 내부 의 명령 줄 은 FOR 에 의해 각각 실행되며 Windows 명령 프로세스 는 배치 파일을 백그라운드에서 처리 하고 명령 줄은 추가 인수로 추가됩니다.`
usebackq
/F
cmd.exe
%ComSpec% /c
ComSpec
시스템 환경 변수 %SystemRoot%\System32\cmd.exe
로 사전 정의 된 Windows 환경 변수입니다.
cmd /?
명령 프롬프트 창 에서 실행시 도움말 출력은 옵션 /C
(명령 줄 실행 및 닫기) 또는 옵션 /K
(명령 줄 실행 및 계속 실행) 후 Windows 명령 프로세서에서 문자열을 해석하는 방법을 설명합니다 .
실행할 명령 줄 자체에를 포함하는 하나 이상의 인수가 포함되어 있지 않기 때문에 역 따옴표를 사용할 필요가 없습니다 '
. 따라서 명령 줄을 '
.
FOR 에서 실행할 명령 줄 , Windows 명령 인터프리터가 배치 스크립트를 구문 분석하는 방법, 즉 FOR 명령 줄 cmd.exe
이 배치를 디버깅 할 때 볼 수있는 배치 파일을 처리하여 구문 분석 및 처리 한 후 어떻게 보이는지 고려해야합니다. 파일 및 명령 줄이 cmd.exe
백그라운드에서 실행되는 두 번째 인스턴스에 인수 문자열로 전달되는 방법 .
최소한 다음 두 가지 해결책이 있습니다.
for /F "delims=" %%G in ('^""%ProgramFiles(x86)%\ABC\DEF\XYZ.exe" Get /a "P1=D2" /b "Q1=D3" /c "D5"^"') do set "var=%%G"
for /F "delims=" %%G in ('""C:\Program Files (x86^)\ABC\DEF\XYZ.exe" Get /a "P1^=D2" /b "Q1^=D3" /c "D5""') do set "var=%%G"
첫 번째 솔루션은 Compo 에서 제안했으며 더 쉬운 솔루션 입니다. 전체 명령 라인에 봉입 "
된 cmd.exe
처리 및 나머지 명령 라인을 실행하기 전에 배경 제거합니다 시작. "
명령 줄의 시작과 끝에 추가 된 것은 인수 문자열의 시작 / 끝이 아닌 리터럴 문자로 해석 될 배치 파일을 처리하기 ^
위해 이스케이프 cmd.exe
처리됩니다. 따라서 이스케이프 된 두 사이의 인수 문자열 은 FOR 명령 줄 "
을 cmd.exe
처리하여 정상적으로 해석됩니다 .
두 번째 해결책은 이해하기 더 어렵습니다. 백그라운드에서 시작하기 "
위해 전체 명령 줄도 포함 cmd.exe
되어 있습니다. 그러나 큰 따옴표는 cmd.exe
배치 파일 을 처리하기 위해 이스케이프되지 않으므로이 cmd.exe
인스턴스는 이제 명령 줄을 다음 인수 문자열 목록으로 해석합니다.
""
C:\Program
Files
(x86
)
\ABC\DEF\XYZ.exe
" Get /a "
P1=D2
" /b "
Q1=D3
" /c "
D5
""
전체 FOR 명령 줄 (x86
을 cmd.exe
처리하기 위해 큰 따옴표로 묶인 인수 문자열 외부에 있기 때문에이 경우 닫는 둥근 대괄호 는 리터럴 문자로 해석되지 않습니다 . 따라서 실행할 명령 줄의 끝을 표시 하기 전에 잘못된 위치에 놓인 집합의 끝이 아닌 리터럴 문자로 해석 되도록 이스케이프 처리해야합니다 .^
'
두 개의 등호는 모두 cmd.exe
배치 파일 을 처리하기 위해 큰 따옴표로 묶인 인수 문자열 밖에 있습니다. 따라서 cmd.exe
인수 구분자로 해석하고 각각 =
을 공백 문자로 대체 합니다. 때문에 인수의 여기 원하지 않는 즉로 전달되어야 P1=D2
하고 Q1=D3
실행을하지로 P1 D2
하고 Q1 D3
. 따라서 배치 파일 ^
을 cmd.exe
처리하여 인수 구분자가 아닌 리터럴 문자로 해석 하려면 두 등호를 모두 이스케이프해야 합니다.
두 솔루션 모두 Windows가 설치된 백그라운드에서 실행 C:\Windows
되고 32 비트 프로그램 파일은 C:\Program Files (x86)
다음에 실행됩니다 .
C:\Windows\System32\cmd.exe /c ""C:\Program Files (x86)\ABC\DEF\XYZ.exe" Get /a "P1=D2" /b "Q1=D3" /c "D5""
백그라운드 명령 프로세스는 첫 번째와 마지막 "
을 제거한 다음 실행합니다.
"C:\Program Files (x86)\ABC\DEF\XYZ.exe" Get /a "P1=D2" /b "Q1=D3" /c "D5"
이 디렉토리에 생성 할 수 있습니다 C:\Program Files (x86)\ABC\DEF
배치 파일 XYZ.bat
바로 명령 줄을 함유 @echo %0 %*
하고 교체 .exe
로 .bat
포함하는 배치 파일에 대한의 배치 파일 모두에서 어느 배치 파일에 전달 된 매개 변수와 함께 실행되고 있는지 확인하기 위해 명령 줄을. 이렇게하면 명령 프롬프트 창에서 FOR 명령 줄을 @echo off
사용하여 배치 파일을 제거 하고 실행할 때 진행되는 작업을 이해하는 데 도움이됩니다 .
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다