편집하다

편집하다

WMIC 명령의 출력을 변수로 설정하려고 하는데 어떤 이유로 작동하지 않습니다. 누군가 도와줄 수 있나요? 이것이 내가 하려는 일이다

for /f "tokens=*" %q IN (' WMIC /Node^:Comp1 PATH Win32_UserProfile WHERE LocalPath="C:\\users\\ABC1" GET Status ^| find /V "Status" ') do set pat= %q

내가 뭔가 잘못하고 있는 걸까요?

답변1

FOR /F로 실행되는 명령은 따옴표가 없거나 이스케이프 처리되지 않은 모든 cmd.exe 토큰 구분 기호를 공백으로 변환하는 추가 구문 분석을 거칩니다. 그래서 WHERE LocalPath="value"가 됩니다
WHERE LocalPath "value".

당신은 탈출 할 수 있습니다=

for /f "tokens=*" %q IN (
  'WMIC /Node^:Comp1 PATH Win32_UserProfile WHERE LocalPath^="C:\\users\\ABC1" GET Status ^| find /V "Status" '
) do set pat= %q

또는 전체 WHERE 절을 큰따옴표로 묶은 다음 값에 작은따옴표를 사용할 수 있습니다. 이는 FOR /F와 함께 사용할 때 WMIC로 WHERE 절을 작성하는 데 내가 선호하는 방법입니다.

for /f "tokens=*" %q IN (
  'WMIC /Node^:Comp1 PATH Win32_UserProfile WHERE "LocalPath='C:\\users\\ABC1'" GET Status ^| find /V "Status" '
) do set pat= %q

나는 :정말로 탈출할 필요가 없다고 생각하지만, 그것이 어떻게 해를 끼칠 수 있는지도 모르겠습니다.

/F에 대해 WMIC를 사용하여 여러 값을 선택할 때 동일한 문제가 발생할 수 있습니다. 따옴표가 없거나 이스케이프 처리되지 않은 쉼표는 공백으로 바뀝니다. 그러나 이러한 경우 인용은 옵션이 아닙니다. 쉼표를 피해야 합니다.

다음과 같은 것은 작동하지 않습니다:

for /f "delims=" %%A in ('wmic ...... get value1,value2,value3') do ...

쉼표를 피해야 합니다.

for /f "delims=" %%A in ('wmic ...... bet value1^,value2^,value3') do ...

편집하다

실제로 모든 탈출을 완전히 제거할 수 있는 트릭이 있습니다. FOR /F로 실행되는 명령은 CMD /C를 통해 실행되므로 CMD /C가 묶인 큰따옴표를 제거한다는 사실을 활용할 수 있습니다.

따라서 다음과 같은 내용은 이스케이프가 필요한 문자가 없는 한 이스케이프 없이 작동합니다 keyword(첫 번째 구문 분석 중에 인용되지 않음).

for /f "delims=" %%A in (
  '"wmic .... where this='x' and that='y' get value1,value2,value3 | find "keyword"'
) do ...

관련 정보