Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File 批处理-是否有方法在批处理中同步锁定txt文件?_File_Batch File_Text_Cmd_Synchronization - Fatal编程技术网

File 批处理-是否有方法在批处理中同步锁定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

我需要创建一个批处理文件,使用tracert命令someip进行跟踪,并将跟踪写入txt文件。我希望它是快速的,所以我希望为每个跟踪启动一个新命令,使所有跟踪请求一次启动

这是我的乒乓球拍:

@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。非常感谢:)