循环浏览子文件夹以重命名Powershell中的文件

时间:2017-02-21 00:50:00

标签: powershell foreach rename

我有一个文件目录,其中包含许多文件夹。在每个子文件夹中,我有各种各样的文件。我想浏览每个文件,重命名一些项目,并为其中一些项目添加扩展名。我正在使用Powershell来做到这一点。

我的文件名为“。”所有都需要用“_”替换,例如,“wrfprs_d02.03”应该是“wrfprs_d02_03”。我能够使用以下代码在一个文件夹中成功完成此操作:

dir | rename-item -NewName {$_.name -replace "wrfprs_d02.","wrfprs_d02_"}

之后,我做了那些替换,我想在一些文件上添加.grb扩展名,这些文件都以“w”开头,我能够在一个文件夹中执行以下操作:

Get-ChildItem | Where-Object {$_.Name -match "^[w]"} | ren -new {$_.name + ".grb"}

当我从一个文件夹退回并尝试在许多文件夹中迭代执行时,我的代码不起作用。我在一个名为“Z:\ Windows.Documents \ My Documents \ Test_data \ extracted”的目录中,其中包含我想要迭代的所有子文件夹。我使用以下代码:

$fileDirectory = "Z:\Windows.Documents\My Documents\Test_data\extracted"
foreach($file in Get-ChildItem $fileDirectory)
{
dir | rename-item -NewName {$_.name -replace "wrfprs_d02.","wrfprs_d02_"}
Get-ChildItem | Where-Object {$_.Name -match "^[w]"} | ren -new {$_.name + ".grb"}
}

关于我的问题是什么想法?

2 个答案:

答案 0 :(得分:0)

不确定您获得了什么错误,但使用重命名项可能很挑剔。或者至少在我的经历中如此。

我没有问题地使用了以下内容。我的文件名不同,所以我用下划线替换了所有句号。如果文件以" W"开头。然后它改变了该文件的扩展名。

$FilePath = Get-ChildItem "Z:\Windows.Documents\My Documents\Test_data\extracted" -Recurse -File
foreach ($file in $FilePath)
{
    $newName = $file.Basename.replace(".","_") 
    $New = $newName + $file.Extension

    if($file.Name -match "^[w]")
    {
          Rename-Item $file.FullName -NewName "$($New).grb" 
    }
    else
    {
         Rename-Item $file.FullName -NewName $New
    }
 }

希望有所帮助。

答案 1 :(得分:0)

因为在使用管道时$ _被替换为循环。我建议你一个新的代码:

$fileDirectory = "Z:\Windows.Documents\My Documents\Test_data\extracted"

Get-ChildItem $fileDirectory -recurse -file -filter "*.*" |
%{

#replace . by _
$NewName=$_.Name.Replace(".", "_")

#add extension grb if name start by w
if ($NewName -like "w*") {$NewName="$NewName.grb"}

#Add path file
$NewName=Join-Path -Path $_.directory -ChildPath $NewName
#$NewName

#rename
Rename-Item $_.FullName $NewName

}