使用批处理文件检查域 PC 上是否存在文件时进程挂起

Process hangs when checking if files are present across domain PCs with batch file

批处理文件出现以下问题...

问题:我创建了一个批处理脚本来检查文件夹位置中是否存在文件,如果存在文件,它会将 PC 名称(标记为资产)写入日志文件。然而,在扫描 99 台 PC 后,它会挂起大约 20 秒,然后再扫描几台电脑并挂起。我需要想办法让这个 运行 顺利。

性能显示处理器确实达到峰值。我试过从另一个具有相同结果的低优先级批处理文件调用它。

所有 PC 都命名为 "ABC",后跟 4 个数字。

完整代码在下面,因为我不知道重点在哪里。如果有更合适的编辑,我很乐意帮忙。

cls
@echo off
echo Set range of asset tags to scan:

:min
echo:
set /p min="Enter lowest asset number to scan (number only): "
if not defined min goto :min
if %min% lss 1000 (
msg * Asset must be 4 digits
goto :min
)

if %min% gtr 5000 (
msg * Min asset out of range
goto :min
)

:max
echo:
set /p max="Enter highest asset number to scan (number only): "
if not defined max goto :max

if %max% gtr 5000 (
msg * Max asset out of range
goto :max
)

if %max% lss %min% (
msg * Max cannot be lower than min
goto :max
)

set /a max=%max%+1

@echo off
REM Count Logic
set count=%min%

REM sets date/time log stamp to consistent value. If done per line, the         seconds change will create multiple files.
set name=Scan_Results_%DATE:~-4%%DATE:~4,2%%DATE:~7,2%%TIME:~0,2%%TIME:~3,2%%TIME:~6 ,2%%TIME:~10,2%

REM creates a date and time stamped log file from location batch file is run
echo Dictation Scan from %Date% %Time% > %name%.txt
@echo off


:loop
@echo off
set /a count=%count%
echo Asset tag being scanned: %count%
@echo off

REM "ABC" to count as string to inject in filepath
set asset=abc%count%

ping -n 1 %asset%.domain.com > NUL
IF ERRORLEVEL 0 (goto :scan) ELSE goto :No

:scan
REM IF LOGIC (If files are detected DO X or else Y [loop until end])
@echo off
for /F %%i in ('dir /b "\%asset%.domain.com\C$\Program Files\Speech     Machines\SubSpace\temp\*.*"') do (

goto :Yes
)
goto :No

:Yes
echo writing asset to log file
echo %asset% >> %name%.txt
set /a count=%count%+1
goto :iteration

:No
set /a count=%count%+1
goto :iteration

:iteration
REM This is the highest asset tag number that you want to scan
if not #%count%#==#%max%# goto loop
goto final

:final
echo %found% >> %name%.txt
@echo SCANNING COMPLETE.
Pause
exit

中的逻辑
ping -n 1 %asset%.domain.com > NUL
IF ERRORLEVEL 0 (goto :scan) ELSE goto :No

检测离线机器失败。对于等于或大于 n 的任何错误级别值,if errorlevel n 构造将被评估为真,因此,对于任何非负错误级别,if errorlevel 0 将被评估为真。

您可以尝试

ping -n 1 %asset%.domain.com > NUL
if errorlevel 1 ( goto :no ) else ( goto :scan )

ping -n 1 %asset%.domain.com > NUL
if not errorlevel 1 ( goto :scan ) else ( goto :no )

ping -n 1 %asset%.domain.com > NUL && goto :scan || goto :no

ping -n 1 %asset%.domain.com > NUL
if %errorlevel% equ 0 ( goto :scan ) else ( goto :no )

但是,根据源和目标机器的 IP 版本和子网,测试 ping 错误级别并不是测试目标机器是否在线的安全方法(阅读 here