Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.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
Batch file 当字符串不在文件名中或文件已完成写入时移动文件的批处理文件_Batch File - Fatal编程技术网

Batch file 当字符串不在文件名中或文件已完成写入时移动文件的批处理文件

Batch file 当字符串不在文件名中或文件已完成写入时移动文件的批处理文件,batch-file,Batch File,一个程序正在某个目录上写入平面文件,问题是另一个程序在完成写入平面文件之前正在移动该文件。我无法控制这两个程序,只能为这两个程序设置路径/目录,因此我决定创建一个批处理文件,在文件名中没有“~”时移动文件。因为临时文件的文件名中有“~”。你能告诉我我的程序出了什么问题吗 echo off %%a%% = Dir /b|Find /V "~" (C:\source) move %%a%% (C:/dest) pause 任何建议都会有帮助 谢谢 我试过面条密码 对于('dir/b^ fin

一个程序正在某个目录上写入平面文件,问题是另一个程序在完成写入平面文件之前正在移动该文件。我无法控制这两个程序,只能为这两个程序设置路径/目录,因此我决定创建一个批处理文件,在文件名中没有“~”时移动文件。因为临时文件的文件名中有“~”。你能告诉我我的程序出了什么问题吗

echo off

%%a%% = Dir /b|Find /V "~" (C:\source)

move %%a%% (C:/dest)

pause
任何建议都会有帮助

谢谢

我试过面条密码

对于('dir/b^ findstr/i/v/c:“~”)中的/f%%A,请移动%%A(c:\dest)

错误是

文件名、目录名或卷标语法不正确

我很确定C:\dest存在

for /f %%A in ('dir /b^|findstr /i /v /c:"~"') do echo %%A
请参见
以获取/?
目录/?
,以及
findstr/?

对我来说似乎是一个问题

可悲的是,你勇敢地试图解决问题,这是错误的

回到实际问题——我们正在创建一个文件,需要在创建后将其移动

关键问题是——我们如何知道创造是完整的

可能但不太可能该文件确实是作为临时文件创建的,完成后重命名。可能是正在创建的文件名包含
~
,但我认为这种假设非常不可靠<代码>~经常出现在文件名中,但通常出现在短文件名中(“短”名称表示不遵循8.3模式的文件名)

创建文件的常规方法是打开文件,写入文件,完成后关闭文件。听起来可能很明显,但也可以重新打开它并附加更多数据,然后重新关闭它,但这是一种相对罕见的方法

创建应用程序很可能使用开放-写-关闭场景。我们可以在这里批量使用的技巧是,在它关闭之前,它的长度似乎为零,因此

for /f %%a in (*.*) do if %%~za neq 0 ECHO(move "%%a" "c:\dest\"
应该可以工作(请注意,
\
是目录分隔符;
/
是开关指示器。还要注意,
move
命令只是
echo
ed-删除
echo(
在验证后激活move

如果我们有open-write-close-reopen-write_-reach-close场景,它会变得更复杂。然后我们会每隔一段时间(比如5秒左右)获取一个目录列表并将其与上一个列表进行比较。如果文件的文件长度保持稳定且>0,则该文件似乎已准备好传输,否则,请等待下一个
dir
快照


返回OP进行验证/评论…

在文件夹中启动此命令,并查看echo命令写入控制台的内容

@ehco off
for /f "delims=" %%A in ('dir /b /a-d^|findstr /v "~" ') do echo move "%%A" "d:\folder"

谢谢,我在('dir/b^ findstr/i/v/c:“~”)中尝试了移动%%A(c:\dest)错误是“文件名、目录名或卷标语法不正确”你需要指定你正在做的事情,有各种各样的事情要考虑——空格/空格-启动目录等等。我已经向你展示了一般的形式——但是你必须修复它以适合你的系统。我不知道该怎么做。代码>移动%%a(c:\dest.<)/代码>尝试<代码>移动“%%a”c:\dest谢谢这个建议非常完美。括号就是问题所在。谢谢你的代码,我从解释中学到了很多。我确信它在文件名中生成“`”的原因是因为这些是长名称的快速消息。但我相信你的方法更有效。不幸的是,出现了一个错误“系统找不到文件”。“似乎无法在此线程上显示星号。我正在同一目录下运行批处理。”。