【问题标题】:Batch script: echo command to file doesn't work批处理脚本:回显命令到文件不起作用
【发布时间】:2014-04-14 15:21:15
【问题描述】:

我正在尝试编写一个脚本来检查远程工作站是否具有 64 位或 32 位操作系统。脚本 simple 应该检查目录“Program Files (x86)”是否存在,然后将结果回显到 output.txt 文件。由于某种原因,脚本甚至没有创建 output.txt 文件。有什么建议吗?

@echo off
SET output=D:\output.txt
IF EXIST "%output%" DEL "%output%"
FOR /f %%a IN (computers.txt) DO (
CALL :ping %%a

)
GOTO :EOF

:ping
SET pingtest=false
ping -n 1 %1 | find "approximate round trip time" >NUL || SET pingtest=true
set directorytest=true
set directory="\\%1%\c$\Program Files (x86)\"

IF pingtest==true (
dir %directory% >nul 2>nul
if errorlevel 1 (
   set directorytest=false
)

IF directorytest==true ( echo "%1;64bit" >> "%output%" ) ELSE ( ECHO "%1;32bit" >> "%output%" )
)

IF pingtest==false (
ECHO "%1;offline" >> "%output%"
)

:EOF

【问题讨论】:

  • 没有测试你的代码:有一个 % too much in set directory="\\%1%\c$\Program Files (x86)\" (probably a typo, because you are using %1` 在其他行中正确)。

标签: batch-file


【解决方案1】:

您的代码有几处问题。

  1. 在分配 %directory% 变量时,您使用 \\%1%\c$\Program Files (x86)。这里%1%应该是%1

  2. 您正在使用c$ 共享,该共享大部分不再可用(或至少在没有管理权限的情况下不可用)

它可以像这样工作:

@echo off
setlocal enabledelayedexpansion 
echo Welcome

call :ping 192.168.1.1
echo.
echo done with everything
goto eof

:ping
echo Probing %1 ...
set pingtest=false
ping -n 1 %1 | find "Approximate round trip" > nul

IF %ERRORLEVEL% == 0 (
    set tdir="\\%1\c$\Program Files (x86)"
    echo Looking up !tdir!
    dir !tdir! 
    if !ERRORLEVEL! == 0 (
        set arch=64bit
    ) else (
        set arch=32bit
    )
    echo Architecutre of %1 is: !arch! >> output.txt
) else (
    echo Remote host unreachable: %1 >> output.exe
)
goto eof

但是:

这将为每台运行 microsoft 共享服务的机器返回 64bitsamba 并且不将 C$ 共享给任何人,因为 dir 只会在目标时返回非零 ERRORLEVEL不提供该服务或通常不可用。

另一方面,每台提供共享服务的机器都将被标记为32bit

对于任何确实提供对其根驱动器的访问权限的机器(没有人应该),该脚本确实有效。


这是一种更可靠的检查 32/64 位 Windows 操作系统的方法

@echo off
set RemoteHost=192.168.1.100
set RegQry=HKLM\Hardware\Description\System\CentralProcessor\0

reg \\%RemoteHost%\%RegQry% > checkOS.txt

find /i "x86" < CheckOS.txt > StringCheck.txt

IF %ERRORLEVEL% == 0 (
    echo "This is 32 Bit Operating system"
) ELSE (
    echo "This is 64 Bit Operating System"
)

[source]

这个使用了reg.exe,可以查询远程Windows NT机器的注册表。


也可以使用wmic:Example

【讨论】:

  • 是的,这是我的错误(我有错误的find 字符串并且错误级别一直为零)......只是墙上的另一块砖
  • 现在你掉进了著名的“延迟扩张陷阱”^^
  • 我没有,因为我没有使用 for 循环
  • 但您使用 (block)if。有关解释,请参阅@Magoo 的答案。
  • 对。确实,第二次 ERRORLEVEL 检查和 tdir 变量有问题。更正了那些。但是BUT 之后的段落仍然正确,因为原因不是基于经验获得的,而是基于 dir 如何产生错误级别的事实,当然还有依赖C$ 共享的事实在最好的情况下是不可靠的。
【解决方案2】:
IF pingtest==true (

永远不会是真的,因为字符串 pingtesttrue 不一样。

你需要

IF %pingtest%==true (

即使你已经解决了这个问题,还有一个问题:

在块语句(a parenthesised series of statements) 中,整个块被解析并然后执行。块中的任何 %var% 都将替换为该变量的值在解析块时 - 在块执行之前 - 同样适用于 FOR ... DO (block)

因此,IF (something) else (somethingelse) 将在遇到IF 时使用%variables% 的值执行。

解决此问题的两种常见方法是 1) 使用 setlocal enabledelayedexpansion 并使用 !var! 代替 %var% 来访问 var 的更改值或 2) 调用子例程以使用改变了值。

在 SO 上搜索“延迟扩展”以获取许多、许多、许多示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多