我想将具有相同前缀的多个(文本)文件合并为一个文件。此任务是整个批处理的一部分(在 VBScript 中),但由于性能预期,我更倾向于使用本机命令,而不是在 VBScript 中编写循环(打开每个文件,读取整个内容,然后将其写入目标文件)。
目前面临的一个问题COPY
似乎需要你刷新 StdOut 缓冲区(因为它输出它复制的所有文件的名称)我正在寻找 XCOPY
更多标志来配置其行为和输出(/Q
比如禁止显示 xcopy 消息)。
阅读文档: https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-xp/bb491035(v=technet.10)
我遇到了这个:
追加文件
要附加文件,请为目标指定单个文件,但为源指定多个文件(即使用通配符或 file1+file2+file3 格式)。
好的,我写道:xcopy "My file pattern whatsoever.*.tmp" "My destination file.tmp"
不幸的是,它询问My destination file.tmp
是文件还是目录,对此我应该回答F
(表示文件)或D
(表示目录)。注意:它取决于语言(在我的情况下是法语,它是 F 或 R)。
我在上面的文档中注意到了这一点:
指定目标是文件还是目录
如果目标不包含现有目录并且不以反斜杠 (\) 结尾,则会出现以下消息:
Does destination specify a file name or directory name on the target (F = file, D = directory)?
如果要将文件复制到文件,请按 F。如果要将文件复制到目录,请按 D。
您可以使用以下方式隐藏此消息/我命令行选项,这会导致复制如果源不止一个文件或一个目录,则假定目标就是一个目录。
好吧,由于这个/i
标志不符合我的需要,我采取了一个我在这里和那里读到的技巧,例如(在答案中):https://stackoverflow.com/a/45134466
所以我尝试这个:echo F|xcopy "My file pattern whatsoever.*.tmp" "My destination file.tmp"
好了,现在第一个文件被复制到目标文件了,但是对于每个后续文件,都会弹出一个关于替换目标文件的问题(?!!)。顺便说一下,所有文件都被丢弃了,因为该echo
命令没有为它们提供任何输入。
如果我使用这个标志:
/年:抑制确认是否覆盖现有目标文件的提示。
那么我最终得到的目标文件仅包含我想要合并的最后一个文件的内容(即与源模式匹配的最后一个文件)!!!
我也尝试检查它是否只适用于两个文件,例如:xcopy "My file pattern whatsoever.0001.tmp"+"My file pattern whatsoever.0002.tmp" "My destination file.tmp" but I get an error:
找不到文件 - 我的文件模式 whatsoever.0001.tmp+我文件模式 whatsoever.0002.tmp`
如果我在 ; 周围添加空格+
,情况也是一样Invalid number of parameters
,可能是因为 file1+file2+file3 语法不适用于长(包括空格)文件名,如下所示:https://stackoverflow.com/questions/30651776/xcopy-returns-error-invalid-number-of-parameters-when-exclude-parameter-is-set
那么我正在做的事情(或试图做的事情)有什么问题?
答案1
根据一些评论关于这个 Stack Overflow 问题,xcopy
并没有像文档中说的那样进行附加操作。
因此你可以使用类似这样的东西来代替。
type "My file pattern whatsoever.*.tmp" > "My destination file.tmp"
但type
它也会在处理文件名时输出它们,因此您可能会遇到与 相同的问题copy
。为了避免这种情况,您可以将不需要的输出重定向到 NUL,如下所示:
type "My file pattern whatsoever.*.tmp" > "My destination file.tmp" 2>NUL
(使用2>NUL
,因为type
在 StdErr 上显示文件名。)
如果你无论如何都要这么做,你可以继续使用copy
,如下所示:
copy "My file pattern whatsoever.*.tmp" "My destination file.tmp" >NUL
(使用>NUL
,因为copy
在 StdOut 上显示文件名。)