我想弄清楚为什么我的批处理脚本无法正常工作。它调用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。
非常感谢任何帮助。
谢谢!
答案 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