If statement Windows批处理文件中不存在使用IF的奇怪问题

If statement Windows批处理文件中不存在使用IF的奇怪问题,if-statement,for-loop,If Statement,For Loop,我创建了两个批处理文件,使用FOR和IF语句查询远程计算机。如果我对If语句使用短路径,它将按预期工作,但如果路径很长,则不会 这些工作: FOR /F %%i IN (workstations.txt) DO IF NOT EXIST \\%%i\c$\catalog.dat echo Hello -->如果远程工作站上存在catalog.dat文件,则不会执行任何操作 FOR /F %%I IN (workstations.txt) DO IF EXIST \\%%i\c$\catalog

我创建了两个批处理文件,使用FOR和IF语句查询远程计算机。如果我对If语句使用短路径,它将按预期工作,但如果路径很长,则不会

这些工作:

FOR /F %%i IN (workstations.txt) DO IF NOT EXIST \\%%i\c$\catalog.dat echo Hello
-->如果远程工作站上存在catalog.dat文件,则不会执行任何操作

FOR /F %%I IN (workstations.txt) DO IF EXIST \\%%i\c$\catalog.dat echo Hello
-->如果远程工作站上存在catalog.dat文件,则返回Hello

FOR /F %%I IN (workstations.txt) DO IF EXIST \\%%i\"C:\Program Files\Common Files\Symantec Shared\VirusDefs\20140521.001\catalog.dat" echo Hello
但这些都不能正常工作:

FOR /F %%I IN (workstations.txt) DO IF NOT EXIST \\%%i\"C:\Program Files\Common Files\Symantec Shared\VirusDefs\20140521.001\catalog.dat" echo Hello
-->如果catalog.dat文件在远程工作站上存在或不存在,它总是回显Hello

FOR /F %%I IN (workstations.txt) DO IF EXIST \\%%i\"C:\Program Files\Common Files\Symantec Shared\VirusDefs\20140521.001\catalog.dat" echo Hello
-->如果catalog.dat文件在远程工作站上存在或不存在,则它始终不执行任何操作

FOR /F %%I IN (workstations.txt) DO IF EXIST \\%%i\c$\catalog.dat echo Hello
我尝试过缩短路径名(例如“C:\Program Files\catalog.dat”) 我已尝试对程序文件使用环境变量-%PROGRAMFILES% 我尝试在长路径周围使用单引号或不使用引号,但返回“系统找不到指定的路径”

echo Hello只是对这些批处理文件的测试。 我正在尝试从2003服务器更新XP工作站上不受支持的旧版本Symantec,并且我已经更新了一些工作站,因此我想在使用PsExec运行Symantec智能更新程序文件20140521-001-i32.exe之前检查20140521.001\catalog.dat是否存在,因为完成该文件需要15分钟,并且数百个工作站

在将智能更新程序文件复制到工作站的C驱动器后,我用于更新工作站的批处理文件命令是:

FOR /F %%I in (workstations.txt) DO psexec.exe \\%%i c:\20140521-001-i32.exe /q
-->请注意,对于所有这些批处理文件命令,批处理文件(.cmd)、智能更新程序文件和工作站.txt存在于同一目录中

任何帮助都将不胜感激! 谢谢
Oki

这里有一个简单的脚本,用于测试您的逻辑,如果机器已启动,则检查隐藏的文件共享,然后检查子文件夹

@echo off
set MyPath=\Program Files\Common Files\Symantec Shared\VirusDefs\20140521.001

rem note the && means if the first command works i.e. returns exit /b 0 run the second cmd
for %%i in (localhost1 localhost) do call :ping %%i && call :checkDirs %%i
goto :EOF

rem dos function to ping a server return 0 is it's up 1 it is not up
:ping
set server=%1
echo ping %server%
ping.exe -n 1 %server% | findstr /i Reply >NIL
if not errorlevel 1 (
    echo server %server% up
    exit /b 0
) else (
  echo server %server% down
  exit /b 1
)
goto :EOF

:checkDirs
echo check dirs %1
if exist \\%1\c$\. (echo has share) else ( echo no share \\%1\c$\.)
if exist "\\%1\c$\Program Files\." (echo has program files) else (echo no program files)
if exist "\\%1\c$\Program Files\Common Files\." (echo has Common Files) else (echo no common files)
if exist "\\%1\c$%MyPath%" (echo has MyPath) else (echo no MyPath)

goto :EOF

请注意,此论坛已删除我的远程计算机共享双反斜杠,并替换为单反斜杠。谢谢,但我也尝试了\\%%\c$\并且在整个路径上都有引号,因此它包含空格,但仍然不起作用。我还尝试了dir命令来验证路径。还有其他想法吗?解决问题您可以访问\\machine\c$\吗?可能需要ping服务器以查看是否可以首先访问它。