【发布时间】: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