所以我已经在启动时设置了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
答案 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