批量if语句问题

时间:2015-04-09 18:24:50

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

我想弄清楚为什么我的批处理脚本无法正常工作。它调用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!)

无论是gen 8还是gen 9服务器,日志文件都会显示以下内容:*请注意,在cp016819之后的第2行末尾缺少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)

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

非常感谢任何帮助。

谢谢!

2 个答案:

答案 0 :(得分: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. >>

一样

答案 1 :(得分:2)

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

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