Rename-Items 在同一管道中使用 powershell 两次

Rename-Items twice in the same pipeline using powershell

我正在尝试使用 powershell 重命名一堆文件,方法是删除前缀(所有文件都相同),用 space 替换“+”并将其余部分设置为标题大小写。这是我目前所拥有的:

Where-Object { $_ -Match '^Website\.com_+' } |
ForEach-Object
{
    $_ |
    Rename-Item -NewName {$_.Name -replace 'Website\.com_','' -replace '\+',' '};
    Rename-Item $_.Fullname (Get-Culture).TextInfo.ToTitleCase($_)
}

第一次重命名有效,它正确地删除和格式化文件,但第二次重命名说这些项目不存在,这让我觉得我应该然后将它们传递到另一个管道中的另一个 foreach 循环中,但我似乎也无法做到这一点。 似乎有 2 rename-items 并没有真正起作用,我尝试使用替换的标题大小写,但它似乎也不起作用。

分 2 个阶段建立名称然后再做一个 Rename-Item 会更直接 像下面这样的东西应该可以满足你的需要

Where-Object { $_ -Match '^Website\.com_+' } |
ForEach-Object {
$BaseName = ($_.Name -replace 'website\.com','' -replace '\+','')
$FinalName = (Get-Culture).TextInfo.ToTitleCase($BaseName)
Rename-Item $_.FullName -NewName $FinalName
}
ForEach-Object 循环中的

$_ 是该项目的快照 - 它不会动态更改以跟随您对基础文件所做的操作。重命名项目时,$_ 表示 old 名称。因此,当您尝试基于 $_.FullName 进行第二次重命名时,Rename-Item 将找不到任何内容。

解决“将余数设置为首字母大写”问题的一个潜在解决方案是,在循环外,再执行一次 Get-ChildItem 搜索任何属于这种情况的内容,然后分别重命名它们。

终于找到了有用的东西:

$path = "G:\Downloads\Chrome\test2"
$items = (Get-ChildItem -Path $path -File *.mp4 | 
Where-Object { $_ -Match '^Website\.com_+' } |
ForEach-Object{
    $_ |
    Rename-Item -NewName {$_.Name -replace 'Website\.com_','' -replace '\+',' '} -PassThru
})
$items | % {
    Rename-Item -Path $_.FullName  -NewName (Get-Culture).TextInfo.ToTitleCase($_.Name)
}

感谢所有帮助过我的人!