File 批处理-是否有方法在批处理中同步锁定txt文件?
我需要创建一个批处理文件,使用tracert命令someip进行跟踪,并将跟踪写入txt文件。我希望它是快速的,所以我希望为每个跟踪启动一个新命令,使所有跟踪请求一次启动 这是我的乒乓球拍:File 批处理-是否有方法在批处理中同步锁定txt文件?,file,batch-file,text,cmd,synchronization,File,Batch File,Text,Cmd,Synchronization,我需要创建一个批处理文件,使用tracert命令someip进行跟踪,并将跟踪写入txt文件。我希望它是快速的,所以我希望为每个跟踪启动一个新命令,使所有跟踪请求一次启动 这是我的乒乓球拍: @echo off set saveUnrechableLocation=..\pingUnreachableInfo\pingUnrechableInfoDB.txt set IpListLocation=..\ipInfo\all_DB_ip.txt set reachableLocation=..\p
@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
问题是,当我试图使用这个时,我遇到了这个问题:
进程无法访问该文件,因为其他进程正在使用该文件
我能做些什么来解决这个问题?谢谢 Windows重定向不允许多个进程同时打开同一文件进行写访问。写入操作必须序列化。这可以通过批处理完成,如中所示。然而,我认为这个解决方案对你的情况没有帮助 每个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
这是基于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
非常感谢您的回答!我不知道我能像那样找到跟踪变量。只有两个简单的问题:1。你说的追踪是指追踪?因为我没有创建一个名为tracer2的变量。我对批处理有点陌生,这行代码在做什么?“2>nul(类型%tracer%\%1.txt>>%tracer%.txt)”@Moshe9362-1)哎呀!是的,我的意思是写“trace”变量,而不是tracer。2) 请参阅更新的答案。请注意,
%=这是一条注释=%
。我已经修复了一个语法错误错误,以及一个深奥的错误,如果临时文件由于某种原因不存在,可能会导致无休止的循环。实际上,它不起作用。它创建文件,如tracertDB_10.0.0.1.txt
,但在进程结束后没有删除它们,也没有将跟踪复制到tracertDB.txt,也没有退出cmd tracert命令。有什么建议吗?@Moshe9362-Ugh-是的,第一个带有注释的trace.bat应该有效,但是第二个缩写缺少右括号。现在都修好了,但还是有问题。我试过你的修理,但没用。因此,我将发布我的固定解决方案。这与此类似,但批处理文件对“(”和“)”位置非常敏感。我将在一个新的答案中发布我的修复,只需编辑并将我的小修复发布到您的代码中,我将删除我的答案。这是你的答案,但不同的空间lol。非常感谢:)