我试图编写一个脚本来检查远程工作站是否具有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
答案 0 :(得分:1)
您的代码存在一些问题。
分配%目录%变量时,使用\\%1%\c$\Program Files (x86)
。此处%1%
应为%1
您使用的是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
<强> 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"
)
这个使用可以查询远程reg.exe
计算机注册表的Windows NT
。
还有可能使用wmic
:Example
答案 1 :(得分:0)
IF pingtest==true (
永远不会成为现实,因为字符串pingtest
和true
不一样。
你需要
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上的“延迟扩展”。