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

0

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
    
por eadmaster 16.06.2014 / 04:34

2 respostas

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
    
por 24.06.2014 / 06:51
1

Ah, esse retorno extra de carro faz algumas coisas estranhas .

tl; dr : algo assim 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 dando saída estranhamente a esses 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, o FOR apenas ignora as 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 maneira 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 coisa estranha para tentar descobrir, em vez de fazer um trabalho real!

    
por 17.06.2014 / 04:58

Tags