使用Powershell,如何以文件名的特定部分中的' - '替换'0'的方式递归更改文件名?

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

目录结构:

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获得相同的结果?

regex powershell recursion
3个回答
1
投票
$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','-'));

但我觉得更难阅读。


1
投票

使用正则表达式将解决您的问题。虽然不是单线程:)

$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

0
投票

See code in use here

$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

说明

代码是:

  1. 在最后一次发生#之后删除所有内容
  2. 拆分#上的原始字符串,获取最后一个元素,然后用0替换所有-实例
  3. 连接上面的1.2.
© www.soinside.com 2019 - 2024. All rights reserved.