【问题标题】:Batch if statement issue批量 if 语句问题
【发布时间】:2015-04-09 18:24:50
【问题描述】:

我想弄清楚为什么我的批处理脚本不能正常工作。它调用 wmic 查看它是什么服务器型号,然后将一组驱动程序部署到该特定型号。

“wmic csproduct get name”输出:

C:\>wmic csproduct get name 
Name
ProLiant DL360p Gen8

for 命令输出:

C:\>FOR /F "tokens=3" %A IN ('wmic csproduct get name') DO ( echo %A)
C:\>(echo Gen8 )
Gen8

这是脚本:

ECHO !TIME! - Determining if this is a HP Gen 8 or 9 server... >> !LOGFILE!
wmic csproduct get name | FIND /i "Gen" >NUL
if %ERRORLEVEL% EQU 1 (
SET %ERRORLEVEL%=0
ECHO !TIME! - Host doesnt appear to be a HP Gen 8 or 9 server...skipping install >> !LOGFILE!
ECHO !TIME! - ExitCode !ERRORLEVEL! >> !LOGFILE!
IF DEFINED USERNAME (EXIT /B !ERRORLEVEL!) ELSE EXIT !ERRORLEVEL!
)
FOR /F "tokens=3" %%A IN ('wmic csproduct get name') DO (
if %%A equ Gen9 (
ECHO !TIME! - Installing software and drivers for HP Gen 9>> !LOGFILE!
ECHO !TIME! - Installing HP ProLiant Gen9 Chipset Identifier for Windows (cp021663)>> !LOGFILE!
"%~dp0source\cp021663a.exe" /s /f /LOG=!MSILOGFILE!
ECHO !TIME! - Installing Headless Server Registry Update for Windows (cp016819)>> !LOGFILE!
"%~dp0source\cp016819.exe" /s /f /LOG=!MSILOGFILE!
ECHO !TIME! - Installing PFA Server Registry Update for Windows (cp022305)>> !LOGFILE!
"%~dp0source\cp022305.exe" /s /f /LOG=!MSILOGFILE!
ECHO !TIME! - Installing HP ProLiant Integrated Management Log Viewer for Windows Server x64 Editions (cp022717)>> !LOGFILE!
"%~dp0source\cp022717.exe" /s /f /LOG=!MSILOGFILE!
)
if %%A equ Gen8 (
ECHO !TIME! - Installing software and drivers for HP Gen 8>> !LOGFILE!
ECHO !TIME! - Installing Headless Server Registry Update for Windows
(cp016819)>> !LOGFILE!
"%~dp0source\cp016819.exe" /s /f /LOG=!MSILOGFILE!
ECHO !TIME! - Installing PFA Server Registry Update for Windows  
(cp022305)>> !LOGFILE!
"%~dp0source\cp022305.exe" /s /f /LOG=!MSILOGFILE!
ECHO !TIME! - Installing HP Broadcom Online Firmware Upgrade Utility for Windows Server x64 Editions (cp024029)>> !LOGFILE!
"%~dp0source\cp024029.exe" /s /f /LOG=!MSILOGFILE!
)
ELSE (ECHO !TIME! - ...model is not listed, so please add drivers >> !LOGFILE!)

无论是第 8 代还是第 9 代服务器,日志文件都将显示以下内容: *请注意,它在 cp016819 之后的第二行末尾缺少 a )。另请注意,它没有呼应第一行“为第 9 代安装软件和驱动程序”

日志文件

14:06:21.16 - Installing Headless Server Registry Update for Windows (cp016819
14:06:24.38 - Installing PFA Server Registry Update for Windows (cp022305)
14:06:27.47 - Installing HP ProLiant Integrated Management Log Viewer for Windows Server x64 Editions (cp022717)

所以问题是脚本只通过第 9 代 if 语句,而不管检查它是第 8 代还是第 9 代。第二,它还跳过了 if 语句的前几行(不输出到日志文件为你可以在上面看到)。我也知道它使用的是 Gen 9,因为 Gen 8 没有安装程序 cp022717。

任何帮助将不胜感激。

谢谢!

【问题讨论】:

  • 检查圆括号。看起来好像 do-block 缺少它的右括号
  • WMI 查询结果采用不常见的编码格式——如果我没记错的话,我认为是 UCS-2 Little Endian。使用"tokens=2 delims=," 并在您的wmic 命令中添加一个一次性列会有所帮助——类似于for /f "tokens=2 delims=," %%A in ('wmic csproduct get name^,UUID /format:csv ^| find "-"') do stuff
  • @rojo WMI 查询结果采用 UTF-16 Little Endian 格式。重定向到文件中,可以看到典型的ÿþ字节序标记,即0xFF后跟0xFE。所以命令FOR /F "tokens=3" %A IN ('wmic csproduct get name/value') DO @echo "%A" 会返回"blabla,而后面的" 会丢失。带有中缀循环的解决方案:FOR /F "tokens=3" %G IN ('wmic csproduct get name/value') DO @for %A in (%G) do @echo "%A" 正确返回 "blabla"
  • 1.在echo blabla n>>%logfile% 中:如果`n` 是一个以空格开头的数字,那么n 被认为是>>>redirection so output could get lost 的数字句柄。使用>>%logfile% echo blabla n 语法。 2.在>>%logfile% echo blabla (foo)中,括号应转义如下:>>%logfile% echo blabla ^(foo^)。真的,我不知道为什么:最好投票而不是给出不完整的答案...
  • 我从回显行中删除了所有括号,现在它会检查第 8 代或第 9 代。但是,我仍然不明白为什么我不能将第一行回显到日志文件中,但我可以回显以下几行?我在 echo 命令中看不到“n”。感谢您的帮助。

标签: batch-file if-statement for-loop cmd wmic


【解决方案1】:

在任何块语句(带括号的一系列语句)中,您需要转义任何 用插入符号关闭块的右括号,因此:^)

echo 语句中的每个右括号执行此操作,检查左括号和右括号的平衡(缩进对此很有用 - 忽略前导空格)并确保 else 被编程为) else (

【讨论】:

    【解决方案2】:

    您不能在 ) 之后的单独行中添加最后的“ELSE”子句。你必须写:

    ...
    ) else (
    ...
    

    不是

    ...
    )
    else (
    ...
    

    (也许这只是您帖子的格式?)

    最重要的是,不要在要回显的文本中使用 (),使用 []。 cmd在解析()方面很差。您注意到第二行缺少 ) 。我怀疑它将此) 解释为if %%A equ Gen9 的结束),然后将另一个) 解释为for 语句的结束)。然后,当它到达if %%A equ Gen8 时,您就在for 语句之外并且%%A 不再是Gen8。

    此外,在 JosefZ 关于n>>fileName 的评论中,他指的是您的9>>fileName,即他指的是n 是1-9 中的数字的情况。在>>之前放一个空格,这样你就有Gen 9 >>,或者更好的是在它们之间放一个句点,如Gen 9. >>

    【讨论】:

      猜你喜欢
      • 2021-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-16
      • 2021-05-15
      • 2012-11-19
      • 2023-03-19
      • 1970-01-01
      相关资源
      最近更新 更多