当指定输出名称时,WildCards 会破坏 Copy 的输出文件

当指定输出名称时,WildCards 会破坏 Copy 的输出文件

copy当在源中使用通配符(*?)并指定输出名称时,会创建一个几乎为空(1K)的文件。

copy /D /V *?ample.png %homepath%/example.png

它适用于某些文件类型(.txt .rtf)
copy /D /V *?ample.txt %TEMP%\example.txt

有趣的是,源和目标中的通配符解决了这个问题,
copy "*xample.pdf" "%TEMP%/*xample.pdf"
但弄乱了文件名,它变成:示例.pdf

这是一个 Bug 还是坏的句法?我困惑了。

我对 Windows 7 x86_64
相关问题
使用 wildard 和 DOS COPY 命令会损坏目标文件
如何在 Windows 中使用通配符复制文件而不附加任何内容?

答案1

我认为这是一个(误用)功能。
我的 Windows 10help copy提示:

要附加文件,请为目标指定单个文件,但为源指定多个文件(使用通配符或 file1+file2+file3 格式)。

如果文件格式不支持简单连接的源文件,则用户需要记住这一点。

巴厘岛的答案您的第一个链接完全回答了您的问题。

如果只有一个名称不清楚的源文件,则可以使用不同的解决方法:

for %A in (*?ample.png) Do copy "%A"  "%homepath%/example.png"

答案2

使用通配符有一个问题... 您将(可能)许多文件复制到一个目标中,多次无用地覆盖这个可怜的文件 :)。但是,它确实带来了这个有趣的“功能”。我很想拿出我的 DOS 软盘来检查这个错误是否已经存在很久了。

恭喜你发现了 DIR 中这个有趣的错误!复制的文件最终被损坏。它非常一致,不依赖于 /D /V 开关,并且仅在反复覆盖同一文件时发生。使用 xcopy 时不会出现此错误,这对所有 Windows 用户来说都是个好消息。

答案3

copy必须知道文件的类型:“ASCII 文本”/A或“二进制文件”/B

二进制文件/B除非您正在合并文件,否则会假定如此。
但是当您在源中放置通配符并指定输出名称时,Windows 会“假定”您正在合并文件,并使用“ASCII 文本”解释器,从而生成一个 1K 的空文件。

所以/B 在所有非“ASCII 文本”文件中
,在指定输出名称的源中使用通配符时,必须使用 参数(表示二进制文件) 。

copy /B /D /V *?ample.png %homepath%/example.png

称其为 Bug,一个愚蠢的 Microsoft 功能,但事实就是这样。

来源

相关内容