Powershell从文件名中删除前导零

时间:2018-05-07 08:32:51

标签: powershell

我有一个包含几个文件的文件夹,如下所示:

  

XXX_01_07_11_1.bat
  XX_1_07_06_02.bat
  XXXX_2_22_14_01_02.bat

没有特定的长度。

我想重命名文件夹中的所有文件,删除所有前导零。 例如,XXX_01_07_11_1.bat将重命名为XXX_1_7_11_1.bat。

我在Bash中找到了一些方法,但没有使用powershell。

5 个答案:

答案 0 :(得分:1)

试试这个:

get-childitem "c:\temp" -file -filter "*.bat" | %{

$NewName=($_.Name -split '_' | %{if ($_ -eq '0') {'0'} else {$_.TrimStart('0')}}) -join '_'
Rename-Item $_.FullName $NewName

}

答案 1 :(得分:1)


最简单的方法是将ggplot(iris, aes(x=Sepal.Length, y=Species, fill=..x..)) + geom_density_ridges_gradient() 替换为_0,如下所示:

_

请试一试。 :)

答案 2 :(得分:1)

cd c:\temp

'X_01_00007_11_1.bat','X_1_07_06_02.bat','X_2_22_14_01_02.bat','X_000_0_07_06_02.bat'|% {
New-Item $_ -Force}

Get-ChildItem -Path C:\Temp -File |ForEach-Object {
    $oldname=$_.Name
    $newname = $oldname -replace '_0+(?=\d)', '_'
    #or
    #$newname = $oldname -replace '_0+(\d)', '_$1'
    Rename-Item $oldname -NewName $newname 
}

目录:C:\ temp

模式LastWriteTime长度名称
---- ------------- ------ ----
-a ---- 2018/5/7 20:55 0 X_01_00007_11_1.bat
-a ---- 2018/5/7 20:55 0 X_1_07_06_02.bat
-a ---- 2018/5/7 20:55 0 X_2_22_14_01_02.bat
-a ---- 2018/5/7 20:55 0 X_000_0_07_06_02.bat

PS C:\ temp> DIR

目录:C:\ temp

模式LastWriteTime长度名称
---- ------------- ------ ----
-a ---- 2018/5/7 20:55 0 X_0_0_7_6_2.bat
-a ---- 2018/5/7 20:55 0 X_1_7_11_1.bat
-a ---- 2018/5/7 20:55 0 X_1_7_6_2.bat
-a ---- 2018/5/7 20:55 0 X_2_22_14_1_2.bat

答案 3 :(得分:1)

注意:这与accepted answer类似,但表明您可以将Get-ChildItem输出直接传递给Rename-Item,这是Get-ChildItem . -Filter *.bat | Rename-Item -NewName { $_.Name -replace '(?<=_)0+' } -WhatIf 更简洁,更有效率。

.

指定所需的目标文件夹而不是-WhatIf
{ ... } 预览重命名;将其删除以实际重命名。

  • 您可以将脚本块Rename-Item -NewName)传递给$_,对每个输入对象(文件)进行评估,其中{{1}指的是手边的文件。

    • 请注意,即使-NewName[string]类型参数,此方法仍然有效。相反,传递脚本块的能力 - 脚本块参数是一个强大的通用PowerShell功能,允许您计算 每个输入的参数值-object 基于脚本块 - 有关详细信息,请参阅here
  • -replace执行基于正则表达式的字符串替换,'(?<=_)0+'替换一个或多个(+0字符的任何序列,如果前面带有({ {1}})?<=字符。

    • _是(正) lookbehind断言的实例,这意味着虽然(?<=_) 匹配,但它不会被捕获;也就是说,它不会成为替换的一部分。
    • 由于没有给出替换字符串,因此有效地删除了

答案 4 :(得分:1)

应用_0+(?=[1-9])_0+(?=\d)正则表达式,如下所示:

Get-ChildItem . -File -Filter "*_0*.*" |
    ForEach-Object {
        Rename-Item $_.FullName $($_.Name -replace '_0+(?=\d)', '_') -WhatIf
    }

调试后立即删除风险缓解参数-WhatIf(或使用-WhatIf:$false来抑制$WhatIfPreference值产生的自动 WhatIf 行为变量是1,另见Get-Help about_Preference_Variables)。

正则表达式解释:

  • _匹配字符_ 低线(下划线)字面上
  • 0+字面匹配字符0
    • +量词 - 在一次和无限次之间匹配,尽可能多次,根据需要回馈(贪婪
  • ?=积极前瞻。断言上面跟_0+匹配
    • [1-9] [1-9]列表中的单个字符,即1(unicode 49)和9(unicode 57)之间的范围,或
    • \d一个数字(等于[0-9]列表[1-9]有效地归因于上面的贪婪'0 +'。