使用PowerShell复制后重命名

Sam*_*abu 9 powershell powershell-2.0

我试图递归复制文件并重命名它们.

我的文件夹中有相同名称的文件,所以我需要在复制时重命名它.

但我一直面临着问题.以下是我的代码.它应该找到CopyForBuild.bat文件并将其复制到E:\ CopyForBuild文件夹.复制后,第一个文件应为Copyforbuild1.txt,第二个文件为CopyforBuild2.txt,依此类推.

以下是我的代码.我哪里失败了?

$File = Get-ChildItem -Path V:\MyFolder -Filter CopyForbuild.bat -Recurse

$i=1
Foreach ($f in $File)
{

   Copy-Item $f "E:\copyforbuild\"
   Rename-Item  -path "E:\Copyforbuild\"+"$f" -newname "CopyForbuild"+"$i"+".txt"
   $i = $i+1
}
Run Code Online (Sandbox Code Playgroud)

And*_*huk 14

您可以在Copy-Item中复制时重命名文件,只需在两个位置提供完整路径:

copy-item c:\PST\1.config c:\PST\2.config
Run Code Online (Sandbox Code Playgroud)

这会将1.config重命名为2.config.无需调用单独的重命名功能.你的代码现在应该是这样的:

$File = Get-ChildItem -Path "V:\MyFolder\" -Filter CopyForbuild.bat -Recurse

$i=1
Foreach ($f in $File)
{
   Copy-Item $f.FullName ("E:\copyforbuild\" + $f.BaseName + $i +".txt")
   $i++
}
Run Code Online (Sandbox Code Playgroud)

如果使用For循环,你可以使它更短:

$File = Get-ChildItem -Path "V:\MyFolder\" -Filter CopyForbuild.bat -Recurse

for($i = 0; $i -lt $File.Count; $i++)
{
   Copy-Item $File[$i].FullName ("E:\copyforbuild\" + $File[$i].BaseName + $i +".txt")
}
Run Code Online (Sandbox Code Playgroud)

如果遵循理查德的评论,或者更短更宽

  • 为什么不一次处理一个(并记住变量获取默认值):`Get-ChildItem -Path V:\ MyFolder -filt CoptForBuild.bat -rec | Copy-Item -dest {"E:\ copyforbuild \"+ $ _.BaseName +($ i ++)+".txt"}`.(具有不带类型对象的参数的Cmdlet,如`Copy-Item`的目的地,通过使用大括号来内置for-each,因此不需要循环来确定目标.) (4认同)