1

I'd like to read the current monitor resolution and set an environment variable. This works in WinXP, but not in Vista because wmic adds a newline at the end:

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

Adding a test does not work as expected:

FOR /F %%L IN ('wmic desktopmonitor get screenheight') DO if not [%%L]==[] set YRES=%%L
eadmaster
  • 1,257
  • 1
  • 18
  • 31

2 Answers2

2

Thanks to Ben Nesson answer i've found an easy solution that works both on XP and Vista: just pipe wmic output to findstr and strip all the newlines:

FOR /F %%L IN ('wmic desktopmonitor get screenheight ^| findstr "."') DO set YRES=%%L
eadmaster
  • 1,257
  • 1
  • 18
  • 31
1

Oh, that extra carriage return does some weird stuff.

tl;dr: Something like this seems to work:

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

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

Anyway, the root of the problem, as you've noted, is wmic weirdly outputting those extra carriage returns. (It also throws in some spaces for good measure, but without "delims=" or something, those get thrown out by the for loop.) Ordinarily, FOR will just ignore blank lines, but for some reason, instead of the standard "\r\n" newline, wmic spits out "\r\r\n". And I guess FOR doesn't handle that sensibly.

Matter of fact, cmd in general doesn't handle that sensibly. I tried setting %%L to a temp variable and checking the temp variable with EnableDelayedExpansion, but it didn't work reliably; it seems that %var% will discard carriage returns, while !var! retains them. Go ahead, try and guess what output you'll get from this:

@ 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!]

So thanks, you've given me a new weird thing to try to figure out in lieu of doing actual work!

Ben Nesson
  • 76
  • 3