我需要创建一个批处理文件,使用tracert命令跟踪一些ip,并将跟踪写入txt文件。我希望它快速,所以我想为每个跟踪启动一个新命令,以便立即启动所有跟踪请求。
有我的ping.bat:
@echo off
set saveUnrechableLocation=..\pingUnreachableInfo\pingUnrechableInfoDB.txt
set IpListLocation=..\ipInfo\all_DB_ip.txt
set reachableLocation=..\pingRechableInfo\RechableIp\pingRechableInfoDB.txt
set trace=..\pingRechableInfo\tracert\tracertDB.txt
set numberOfPings=1
@echo pinging DB > %saveUnrechableLocation%
copy /y NUL %reachableLocation% > NUL
copy /y NUL %trace% > NUL
for /F "tokens=*" %%A in (%IpListLocation%) do (
ping -n %numberOfPings% %%A | find "TTL=" >nul
if errorlevel %numberOfPings% (
@echo %%A not rechable >> %saveUnrechableLocation%
)
if not errorlevel %numberOfPings% (
@echo %%A >> %reachableLocation%
start trace.bat %trace% %%A
)
)
和trace.bat看起来像这样:
@echo off
set saveLocation=%~1
set ip=%~2
tracert %ip% >> %saveLocation%
exit
问题在于,当我尝试使用此功能时,我遇到了这个问题:
该进程无法访问该文件,因为它正由另一个进程使用
我该怎么做才能解决这个问题?谢谢!
答案 0 :(得分:5)
Windows重定向不允许多个进程同时打开相同的文件以进行写访问。写操作必须序列化。这可以通过批处理来完成,如https://stackoverflow.com/a/9344547/1012053所示。但是,我不认为这个解决方案会对您的情况有所帮助。
每个tracert进程都需要相当长的时间,并且输出必须在整个时间内重定向。但是您希望同时运行多个进程,所有输出都重定向到同一个文件。即使你要使它工作,输出也是交错的,你将无法弄清楚这一切意味着什么。
我建议将每个tracert输出重定向到一个唯一的文件。您可以将ip地址合并到输出文件名中,您可以使用我展示的技术在每个过程完成后合并文件。
请注意,无需传递输出位置。每个子进程都可以访问跟踪变量,因此可以轻松地重定向到正确的位置。
ping.bat更改大纲
...
set trace=..\pingRechableInfo\tracert\tracertDB
...
start trace.bat %%A
...
修改了trace.bat
@echo off
tracert %1 >%trace%_%1.txt %= Redirect TRACERT to unique temp file =%
:merge
2>nul ( %= Hide error messages inside the outer parentheses =%
>>%trace%.txt ( %= Attempt stdout redirection - Fails if already locked =%
type %trace%_%1.txt %= Write the temp file to the merge file =%
(call ) %= Clear any error that TYPE may have generated =%
)
) || goto :merge %= Loop back and try again if stdout redirection failed =%
del %trace%_%1.txt %= Delete the temporary file =%
exit
没有评论的简短表格可能如下所示:
@echo off
tracert %1 >%trace%_%1.txt
:merge
2>nul (>>%trace%.txt (type %trace%_%1.txt&(call )))||goto :merge
del %trace%_%1.txt
exit
答案 1 :(得分:1)
这是基于dbenham答案的固定代码:
@echo off
tracert %1 >%trace%_%1.txt
:merge
2>nul (
>>%trace%.txt (
type %trace%_%1.txt
(call )
)
) ||goto :merge
del %trace%_%1.txt
exit