批处理脚本:echo命令到文件不起作用

时间:2014-04-14 15:21:16

标签: batch-file

我试图编写一个脚本来检查远程工作站是否具有64位或32位操作系统。简单的脚本应检查目录" 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

2 个答案:

答案 0 :(得分:1)

您的代码存在一些问题。

  1. 分配%目录%变量时,使用\\%1%\c$\Program Files (x86)。此处%1%应为%1

  2. 您使用的是c$分享,此分享几乎不再可用(或至少没有管理权限)

  3. 它可以像这样工作:

    @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
    

    <强> BUT:

    对于运行Microsoft共享服务或64bit并且不与任何人共享samba的每台计算机,这将返回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


    还有可能使用wmicExample

答案 1 :(得分:0)

IF pingtest==true (

永远不会成为现实,因为字符串pingtesttrue不一样。

你需要

IF %pingtest%==true (

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

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

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

解决此问题的两种常见方法是1)使用setlocal enabledelayedexpansion并使用!var!代替%var%来访问已更改的var或2}值以进行调用一个子程序,用于使用更改的值执行进一步处理。

在许多很多很多例子中搜索SO上的“延迟扩展”。