【问题标题】:Cycle through sub-folders to rename files in Powershell循环浏览子文件夹以重命名 Powershell 中的文件
【发布时间】:2017-07-10 10:52:10
【问题描述】:

我有一个文件目录,其中包含许多文件夹。在每个子文件夹中,我都有各种文件。我想浏览每个文件,重命名一些项目,并为其中一些添加扩展名。我正在使用 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"}
}

对我的问题有什么想法吗?

【问题讨论】:

    标签: powershell foreach rename


    【解决方案1】:

    不确定您遇到了什么错误,但使用 rename-item 可能很挑剔。或者至少在我的经验中是这样。

    我使用以下没有问题。我的文件名不同,所以我用下划线替换了所有句点。如果文件以“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
        }
     }
    

    希望对您有所帮助。

    【讨论】:

    • 谢谢!该代码几乎对我有用。由于我正在使用的特定文件,我做了一些修改。我看到文件名更改“。”到 Powershell 窗口中的“_”,但是当我打开 Windows 资源管理器时,句点实际上并没有变为下划线。虽然已经添加了扩展,所以这部分已经解决了!
    • 您是对的,我们进行了更改,但从未真正保存这些更改。我现在用一个合适的例子来更新它。希望这有助于让我知道,如果没有。
    【解决方案2】:

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

    $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
    
    }
    

    【讨论】:

    • 我收到以下代码错误:Get-ChildItem:找不到与参数名称“文件”匹配的参数。
    • 你的 powershell 版本是多少?
    猜你喜欢
    • 2021-09-14
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多