我有以下命名约定的文件目录:“###随机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?我缺少的是在这里吗?
如果不指定第二个(长)参数的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)
会的工作,但矫枉过正在这种情况下。
由于有机磷农药的意见,我测试了一些,而且的确......人们似乎从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.
而不是使用的SubString
您可以使用Remove
:
Get-ChildItem -File | Rename-Item -NewName { $_.Name.Remove(0,4) }
多一个解决方案,它检查#
每一个地方
Get-ChildItem -Path E:\temp\*#* | Rename-Item -NewName { $_.fullname.replace('#','') }