在Vista命令行上进行递归文件复制和重命名

时间:2009-05-23 00:56:07

标签: command-line windows-vista recursion copy for-loop

我正试图通过我的音乐目录递归并将名为folder.jpg的每个文件复制到名为cover.jpg的同一目录中的文件中。

我在this question中尝试了各种建议,例如:

for /r %i in (folder.jpg) do copy %i cover.jpg

导致“系统无法找到指定的文件。”

我该如何解决这个问题?

修改

这就是我最终的目标:

for /r %i in (folder.jpg) do copy "%i" "%~picover.jpg"

5 个答案:

答案 0 :(得分:5)

试试这个:

for /f "usebackq delims==" %I in (`dir /b /s ^| findstr folder.jpg`) do copy "%I" "%~pIcover.jpg"

解码器响铃:

usebackq :: run the command in the backquotes and use the output as the input for the loop
delims== :: use the equal sign as a delimeter. Really you could use any character that isn't valid in a file name
dir /b /s :: do a recursive directory listing only outputting the bare file names
^| :: ^ escapes the pipe character, the pipe - well pipes the output from the first command to the second
findstr :: searches the input for matching lines, and only outputs them
%~pI :: the tilde p instructs the variable expansion to only output the path rather than full file name + path. Note, this includes a trailing \

我希望这有帮助!

答案 1 :(得分:1)

你的音乐文件夹中可能没有任何名为folder.jpg的文件,所以它失败了吗?

我在mymusic文件夹中尝试了一个名为folder.jpg的虚拟文件并正常复制它。 ;)

编辑:

Kishi是对的,你错过了第二个%i上的双引号

答案 2 :(得分:1)

您在复制命令中缺少双引号。

%i变量将保存文件的完整路径 - 可能包含空格。 尝试使用:

for /r %i in (folder.jpg) do copy "%i" cover.jpg

答案 3 :(得分:1)

PowerShell必须替换CMD。这是不可避免的,也是正义的。我的工作是帮助它......

gci -r . folder.jpg | % { copy $_.FullName ([IO.Path]::Combine( $_.Directory.FullName, "cover.jpg" )) }

答案 4 :(得分:0)

您可以将xcopy与/ s标志一起使用...

编辑: 我的坏 - 没有正确地阅读这个问题。只需将文件复制到固定目的地时,带/ s的Xcopy将有所帮助。