comment tester un paramètre vide dans une boucle for / f

0

J'aimerais lire la résolution actuelle du moniteur et définir une variable d'environnement. Cela fonctionne dans WinXP, mais pas dans Vista car wmic ajoute une nouvelle ligne à la fin:

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

L'ajout d'un test ne fonctionne pas comme prévu:

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

Réponses:

1

Oh, ce retour de voiture supplémentaire fait des trucs bizarres .

tl; dr : Quelque chose comme ça semble fonctionner:

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

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

Quoi qu’il en soit, comme vous l’avez indiqué, le problème est que wmic produit bizarrement ces retours chariot supplémentaires. (Il jette également dans certains espaces pour faire bonne mesure, mais sans "delims =" ou quelque chose, ceux-ci sont éjectés par la boucle for.) Ordinairement, FOR ignore simplement les lignes vides, mais pour une raison quelconque, au lieu du standard "\ r \ n "newline, wmic crache" \ r \ r \ n ". Et je suppose que FOR ne gère pas cela raisonnablement.

En fait, cmd en général ne gère pas cela de façon sensée. J'ai essayé de définir %% L sur une variable temporaire et de vérifier la variable temporaire avec EnableDelayedExpansion, mais cela ne fonctionnait pas de manière fiable. il semble que% var% va rejeter les retours chariots, tandis que! var! les conserve. Allez-y, essayez de deviner quelle sortie vous obtiendrez de ceci:

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

Alors merci, vous m'avez donné une nouvelle chose étrange d'essayer de comprendre au lieu de faire du travail réel!

Ben Nesson
la source
1

Grâce à Ben Nesson answer, j'ai trouvé une solution simple qui fonctionne à la fois sous XP et Vista: il suffit de diriger la sortie wmic pour trouver et supprimer toutes les nouvelles lignes :

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