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)
}
感谢所有帮助过我的人!
我正在尝试使用 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)
}
感谢所有帮助过我的人!