如何在 for/f 循环中测试空参数

如何在 for/f 循环中测试空参数

我想读取当前显示器分辨率并设置环境变量。这在 WinXP 中有效,但在 Vista 中无效,因为 wmic 在末尾添加了换行符:

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

答案1

感谢 Ben Nesson 的回答,我找到了一个适用于 XP 和 Vista 的简单解决方案:只需将 wmic 输出传输到findstr 并删除所有换行符

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

答案2

哦,额外的回车确实有点奇怪的东西

总结:这样的方法似乎有效:

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

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

无论如何,正如您所指出的,问题的根源在于 wmic 奇怪地输出了那些额外的回车符。(它还会添加一些空格以增加效果,但如果没有“delims=”或其他东西,这些空格就会被 for 循环抛出。)通常,FOR 只会忽略空行,但出于某种原因,wmic 会输出“\r\r\n”,而不是标准的“\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!]

所以谢谢你,你给了我一个新的奇怪的东西让我去尝试弄清楚,而不是做实际的工作!

相关内容