como testar o parâmetro vazio em um loop for / f

0

Eu gostaria de ler a resolução atual do monitor e definir uma variável de ambiente. Isso funciona no WinXP, mas não no Vista, porque o wmic adiciona uma nova linha no final:

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

Adicionar um teste não funciona como esperado:

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

Respostas:

1

Oh, esse retorno extra de carro faz algum coisa esquisita .

tl; dr : Algo parecido com isto parece funcionar:

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

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

De qualquer forma, a raiz do problema, como você observou, é o wmic que produz estranhamente os retornos extras de carro. (Ele também coloca alguns espaços para uma boa medida, mas sem "delims =" ou algo assim, eles são descartados pelo loop for.) Normalmente, FOR apenas ignorará linhas em branco, mas por algum motivo, em vez do padrão "\ r \ n "newline, wmic spits out" \ r \ r \ n ". E eu acho que FOR não lida com isso de forma sensata.

De fato, cmd em geral não lida com isso de forma sensata. Eu tentei definir %% L para uma variável temporária e verificar a variável temp com EnableDelayedExpansion, mas não funcionou de forma confiável; parece que% var% descarta retornos de carro, enquanto! var! retê-los. Vá em frente, tente adivinhar qual saída você obterá com isso:

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

Então, obrigado, você me deu uma nova coisa estranha para tentar descobrir em vez de fazer o trabalho real!

Ben Nesson
fonte
1

Graças à resposta de Ben Nesson, encontrei uma solução fácil que funciona tanto no XP quanto no Vista: apenas canalize a saída wmic para findstr e tira todas as novas linhas :

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