通过批处理文件检查远程计算机上的文件

时间:2016-10-19 22:39:18

标签: windows batch-file cmd

所以我已经在启动时设置了MSI软件安装,但是,我注意到某些机器无论出于何种原因都没有安装该软件包。我在MSI安装上遵循了Microsoft的设置,所以理论上的一切都应该没问题。

我想要做的是检查特定文件是否位于计算机上。我已经创建了一个包含所有机器IP地址的txt文件,并且我已尝试使用每个循环来运行文本文件中的IP,如果存在则输出到日志文件。

然而,我遇到的问题是,所有文件都返回,就像文件不存在一样,并将else命令回显到我的日志文件中。我知道大多数这些IP(计算机)都有我指定的目录中的文件。

编辑:现在如果那个IP不存在就会卡住(例如,电脑关闭)。无论如何都要检查一下吗?

ECHO ON
for /F %%a in (ips.txt) do (
    set host=%%a 
    if exist \\%host%\c$\ProgramData\dvsAnalytics\Encore\Config\Encore.ScreenRecording.ClientService.exe.config (
    rem file exists
    ECHO %%a>>"C:\some location\encore-install-success.log"
    ) else (
    rem file does not exist
    ECHO %%a>>"C:\some location\encore-install-fail.log"
    )

)
pause

1 个答案:

答案 0 :(得分:0)

无需使用临时变量host来保存%%a的值,只需直接使用%%a

for /F %%a in (ips.txt) do (
    if exist "\\%%a\c$\ProgramData\dvsAnalytics\Encore\Config\Encore.ScreenRecording.ClientService.exe.config" (
        rem ...rest of your code...
    )
)

如果您坚持使用临时变量,则需要使用delayed expansion,因为它在同一代码块中设置了;否则,您将读取解析整个块时的值。更改后的代码如下所示:

setlocal EnableDelayedexpansion
for /F %%a in (ips.txt) do (
    set "host=%%a" 
    if exist "\\!host!\c$\ProgramData\dvsAnalytics\Encore\Config\Encore.ScreenRecording.ClientService.exe.config" (
        rem ...rest of your code...
    )
)
endlocal

此外,问题代码中的set host=%%a后面有一个尾随空格;如果它也存在于你的实际scipt中,它将成为变量值的一部分并且很可能会打扰;为避免这种情况,应使用语法set "host=%%a"

要检查主机是否可用,您可以使用ping命令。

这适用于IPv4地址:

ECHO ON
for /F %%a in (ips.txt) do (
    ping -n 1 -4 %%a 2> nul | find "TTL=" > nul && (
        if exist "\\%%a\c$\ProgramData\dvsAnalytics\Encore\Config\Encore.ScreenRecording.ClientService.exe.config" (
            rem file exists
            ECHO %%a>>"C:\some location\encore-install-success.log"
        ) else (
            rem file does not exist
            ECHO %%a>>"C:\some location\encore-install-fail.log"
        )
    )
)
pause

这适用于IPv6地址:

ECHO ON
for /F %%a in (ips.txt) do (
    ping -n 1 -6 %%a > nul 2>&1 && (
        rem ...rest of your code...
    )
)
pause