Command line Vista命令行上的递归文件复制和重命名

Command line Vista命令行上的递归文件复制和重命名,command-line,windows-vista,recursion,copy,for-loop,Command Line,Windows Vista,Recursion,Copy,For Loop,我正试图递归遍历我的音乐目录,并将每个名为folder.jpg的文件复制到同一目录中名为cover.jpg的文件中 我尝试过不同的建议,例如: for /r %i in (folder.jpg) do copy %i cover.jpg 导致“系统找不到指定的文件” 我怎样才能解决这个问题 编辑 以下是我最终的结果: for /r %i in (folder.jpg) do copy "%i" "%~picover.jpg" 您的音乐文件夹folder.jpg中可能没有任何文件,所以它会失败

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

我尝试过不同的建议,例如:

for /r %i in (folder.jpg) do copy %i cover.jpg
导致“系统找不到指定的文件”

我怎样才能解决这个问题

编辑

以下是我最终的结果:

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

您的音乐文件夹folder.jpg中可能没有任何文件,所以它会失败,对吗

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

编辑:


Kishi是对的,您缺少第二个%i的双引号

您缺少copy命令的双引号

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

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

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

编辑: 我的坏朋友没有正确地阅读问题。仅将文件复制到固定目标时,带/s的Xcopy将有所帮助。

尝试以下操作:

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 \ usebackq::在反引号中运行命令,并将输出用作循环的输入 delims==::使用等号作为delimeter。实际上,您可以使用文件名中无效的任何字符 dir/b/s::执行递归目录列表,仅输出裸文件名 ^|::^转义管道字符,管道井将输出从第一个命令传输到第二个命令 findstr::搜索输入中匹配的行,并仅输出它们 %~pI::tilde p指示变量展开仅输出路径,而不是完整的文件名+路径。注意,这包括一个尾随字符\
我希望这有帮助

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

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

是的,我确实错过了引语,谢谢。下一个问题是,它总是复制到我运行命令的目录,例如:e:\music实际上你在某个阶段是对的:P我以前递归地重命名了所有folder.jpg文件以覆盖.jpg。这是非常激烈的命令行操作。它完全成功了,谢谢。解码环也很棒,特别是关于pI的部分。我发现对于(folder.jpg)中的/r%I,do copy“%I”“%~picover.jpg”也起作用。因此,PowerShell代码块的格式不太好,因为语法不太像C。所以我通常使用PowerShell。在本例中,它决定两个“u”应使跨度为斜体,即使在。所以我做出了妥协,把它换成了一个代码块。