for / f 루프에서 빈 매개 변수를 테스트하는 방법 환경 변수를 설정하고 싶습니다.

현재 모니터 해상도를 읽고 환경 변수를 설정하고 싶습니다. wmic는 끝에 줄 바꿈을 추가하기 때문에 WinXP에서는 작동하지만 Vista에서는 작동하지 않습니다.

FOR /F %%L IN ('wmic desktopmonitor get screenheight') DO set YRES=%%L

테스트 추가가 예상대로 작동하지 않습니다.

FOR /F %%L IN ('wmic desktopmonitor get screenheight') DO if not [%%L]==[] set YRES=%%L


답변

아, 그 여분의 캐리지 리턴은 이상한 일을 합니다.

tl; dr : 다음과 같은 것이 작동하는 것 같습니다.

FOR /F %%L in ('wmic desktopmonitor get screenheight') DO (
  CALL :foo "%%L"
)
:: ...
GOTO :EOF

:foo
  IF NOT [%~1]==[] set RESULT=%~1
GOTO :EOF

어쨌든, 문제의 근본은 앞서 언급했듯이 추가 캐리지 리턴을 이상하게 출력하는 것입니다. (또한 좋은 측정을 위해 일부 공간에 던져 지지만 “delims =”또는 다른 것 없이는 for 루프에 의해 던져집니다.) 일반적으로 FOR는 빈 줄만 무시하지만 어떤 이유로 표준 “\ r \ n “개행, wmic는”\ r \ r \ n “을 뱉어냅니다. 그리고 나는 FOR가 그것을 현명하게 처리하지 않는다고 생각합니다.

사실, cmd는 일반적으로 그것을 현명하게 처리하지 않습니다. %% L을 임시 변수로 설정하고 EnableDelayedExpansion으로 임시 변수를 확인하려고 시도했지만 안정적으로 작동하지 않았습니다. % var %는 캐리지 리턴을 버리고! var! 그들을 유지합니다. 계속해서 어떤 결과를 얻을지 추측하십시오.

@ echo off
setlocal EnableDelayedExpansion
for /f %%a in ('wmic desktopmonitor get status') DO (
  set t=%%a
  set bang=!t!
)
set doodle=%t%
set bangbang=!bang!
set bangdoodle=%bang%

ECHO [%doodle%]
ECHO [!doodle!]
ECHO [%bang%]
ECHO [!bang!]
ECHO [%bangbang%]
ECHO [!bangbang!]
ECHO [%bangdoodle%]
ECHO [!bangdoodle!]

고마워, 당신은 나에게 실제 작업 대신에 알아낼 새로운 이상한 일을 주었다!


답변

Ben Nesson의 답변 덕분에 XP와 Vista에서 모두 작동하는 쉬운 솔루션을 찾았 습니다. 모든 줄 바꿈을 찾기 위해 스트립 wmic 출력 :

FOR /F %%L IN ('wmic desktopmonitor get screenheight ^| findstr "."') DO set YRES=%%L

답변