目录结构:
C:\C4144754951436B4\RECORDS\7005\2017\12\20\1000\1234#20171220#6359444#0500000000#Maaz0Bin0Mah.Sid0Asr.wav
文件仅存在于最后一个文件夹中(在上述情况下为1000)
当前文件名
1234#20171220#6359444#0500000000#Maaz0Bin0Mah.Sid0Asr.wav
所需的文件名
我需要在0
的最后一次#
之后替换任何-
,结果变为:
1234#20171220#6359444#0500000000#Maaz-Bin-Mah.Sid-Asr.wav
我试过但是无法用递归的方式使用单个衬垫。
PS H:\> $test
1234#20171220#6359444#0500000000#Maaz0Bin0Mah.Sid0Asr.wav
PS H:\> $ol=($test -split "#")[0]+'#'+($test -split "#")[1]+'#'+($test -split "#")[2]+'#'+($test -split "#")[3]+'#'+($te
st -split "#")[4].replace('0','-')
PS H:\> $ol
1234#20171220#6359444#0500000000#Maaz-Bin-Mah.Sid-Asr.wav
如何使用Get-ChildItem
获得相同的结果?
$FullName = 'C:\C4144754951436B4\RECORDS\7005\2017\12\20\1000\1234#20171220#6359444#0500000000#Maaz0Bin0Mah.Sid0Asr.wav'
$NewFullName = $FullName.Substring(0, $FullName.LastIndexOf('#')) + $FullName.Substring($FullName.LastIndexOf('#')).Replace('0','-')
如果你想在Rename-Item
的管道中:
Get-ChildItem -Path $Path -Recurse -File |
Where-Object {
$_.Name.LastIndexOf('#') -ge 0;
} |
ForEach-Object {
$NewName = $_.Name.Substring(0, $_.Name.LastIndexOf('#')) + $_.Name.Substring($_.Name.LastIndexOf('#')).Replace('0','-');
Rename-Item -Path $_.FullName -NewName $NewName;
}
Where-Object
是必要的,因为Substring
需要正面参数,如果#
字符不存在,那么LastIndexOf
返回-1。
我想你可以将它浓缩为:
Get-ChildItem -Path $Path -Recurse -File |
Where-Object {
$_.Name.LastIndexOf('#') -ge 0;
} |
Rename-Item -NewName ($_.Name.Substring(0, $_.Name.LastIndexOf('#')) + $_.Name.Substring($_.Name.LastIndexOf('#')).Replace('0','-'));
但我觉得更难阅读。
使用正则表达式将解决您的问题。虽然不是单线程:)
$currentFileName = '1234#20171220#6359444#0500000000#Maaz0Bin0Mah.Sid0Asr.wav'
$currentFileName -match '(.*#)(.*)'
$newFileName = $Matches[1] + $Matches[2].Replace('0', '-')
$currentFileName, $newFileName
会输出
1234#20171220#6359444#0500000000#Maaz0Bin0Mah.Sid0Asr.wav
1234#20171220#6359444#0500000000#Maaz-Bin-Mah.Sid-Asr.wav
$str = "C:\C4144754951436B4\RECORDS\7005\2017\12\20\1000\1234#20171220#6359444#0500000000#Maaz0Bin0Mah.Sid0Asr.wav"
$a = $str.Substring(0, $str.LastIndexOf("#") + 1) + $str.Split("#")[-1].Replace("0", "-")
Write-Host $a
代码是:
#
之后删除所有内容#
上的原始字符串,获取最后一个元素,然后用0
替换所有-
实例1.
和2.