批处理 - 有没有办法批量同步锁定txt文件?

时间:2016-04-01 21:20:39

标签: file batch-file text cmd synchronization

我需要创建一个批处理文件,使用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

问题在于,当我尝试使用此功能时,我遇到了这个问题:

  

该进程无法访问该文件,因为它正由另一个进程使用

我该怎么做才能解决这个问题?谢谢!

2 个答案:

答案 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