PowerShell的重命名,项目串

问题描述 投票:1回答:3

我有以下命名约定的文件目录:“###随机names.txt中的一群”,我想将文件重命名为同样的事情减去“###”。

应该用很简单:

Get-ChildItem -File | Rename-Item -newname { $_.Name.SubString(4,$_.Name.Length) }

不过,我得到一个“索引和长度必须引用在字符串中的位置。”

我验证与Name.Length:

Get-ChildItem -File | select Name, @{ N='name length';E={$_.Name.Length) } }

$ _。Name.Length返回目录中的每个文件的权限int值

当我试试这个:

Get-ChildItem -File | select Name, @{N='name length';E={ $_.Name.SubString(4,$_.Name.Length) } }

的“名称长度”栏中的空白

为什么子不喜欢$ _。Name.Length?我缺少的是在这里吗?

powershell
3个回答
1
投票

如果不指定第二个(长)参数的Substring()功能,它会返回从第一个参数(字符索引)所采取的字符串的其余部分,所以你可以简单地做:

Get-ChildItem -File | ForEach-Object { $_ | Rename-Item -NewName $_.Name.SubString(4)}

你有"Index and length must refer to a location within the string."错误意味着,第二个参数(想要的长度)超过串的总长度,因为你切断第一4个字符。

$_.Name.SubString(4,$_.Name.Length - 4)

会的工作,但矫枉过正在这种情况下。


EDIT

由于有机磷农药的意见,我测试了一些,而且的确......人们似乎从Get-ChildItem直接通过管道将结果向Rename-Item cmdlet的一个问题。 (我使用PowerShell 5.1)

看来你需要捕获从Get-ChildItem cmdlet并迭代,为了重命名文件德捕获收集的物品。否则,某些文件可能被处理并更名不止一次。

您可以捕获文件的集合在一个变量第一这样的:

$files = Get-ChildItem -File
foreach($file in $files) { $file | Rename-Item -NewName $file.Name.SubString(4)}

或在括号包围Get-ChildItem一部分PetSerAl建议:

(Get-ChildItem -File) | Rename-Item -newname { $_.Name.SubString(4) }

我发现在this answer对此的解释:

There appears to be a bug that can cause bulk file renaming to fail under certain conditions. If the files are renamed by piping a directory listing to Rename-Item, any file that's renamed to something that's alphabetically higher than its current name is reprocessed by its new name as it's encountered later in the directory listing.


0
投票

而不是使用的SubString您可以使用Remove

Get-ChildItem -File | Rename-Item -NewName { $_.Name.Remove(0,4) }

0
投票

多一个解决方案,它检查#每一个地方

Get-ChildItem -Path E:\temp\*#*  | Rename-Item -NewName  { $_.fullname.replace('#','') }
© www.soinside.com 2019 - 2024. All rights reserved.