需要使用Powershell向文件名批量添加字符

需要使用Powershell向文件名批量添加字符,powershell,filenames,Powershell,Filenames,我有一系列文件,它们的名称如下: PRT14_WD_14220000_1.jpg 我需要在最后一个下划线之后和数字之前添加两个零,使其看起来像PRT14_WD_14220000_001.jpg 我试过了” 感谢您的帮助。以下假定您的的最后一部分。BaseName始终需要添加两个零。它的作用是 伪造从get Item/get ChildItem 将其替换为适当的cmdlet。[grin] 将.BaseName拆分为多个部分,并使用\uu作为拆分目标 将两个零添加到上述拆分的最终零件 将部件合并到

我有一系列文件,它们的名称如下:

PRT14_WD_14220000_1.jpg

我需要在最后一个下划线之后和数字之前添加两个零,使其看起来像PRT14_WD_14220000_001.jpg

我试过了”


感谢您的帮助。

以下假定您的
的最后一部分。BaseName
始终需要添加两个零。它的作用是

  • 伪造从
    get Item/get ChildItem

    将其替换为适当的cmdlet。[grin]
  • .BaseName
    拆分为多个部分,并使用
    \uu
    作为拆分目标
  • 将两个零添加到上述拆分的最终零件
  • 将部件合并到一个
    $NewBaseName
  • 获取
    .FullName
    ,并用
    $newBaseName
  • 显示新文件名
你仍然需要重新命名,但这相当直接。[咧嘴笑]

这是密码

# fake getting a file info object
#    in real life, use Get-Item or Get-ChildItem
$FileInfo = [System.IO.FileInfo]'PRT14_WD_14220000_1.jpg'

$BNParts = $FileInfo.BaseName.Split('_')
$BNParts[-1] = '00{0}' -f $BNParts[-1]
$NewBasename = $BNParts -join '_'

$NewFileName = $FileInfo.FullName.Replace($FileInfo.BaseName, $NewBaseName)

$NewFileName

output=
D:\Data\Scripts\PRT14\u WD\u 14220000\u 001.jpg
以下假定您的
的最后一部分。BaseName
将始终需要添加两个零。它的作用

  • 伪造从
    get Item/get ChildItem

    将其替换为适当的cmdlet。[grin]
  • .BaseName
    拆分为多个部分,并使用
    \uu
    作为拆分目标
  • 将两个零添加到上述拆分的最终零件
  • 将部件合并到一个
    $NewBaseName
  • 获取
    .FullName
    ,并用
    $newBaseName
  • 显示新文件名
你仍然需要重新命名,但这相当直接。[咧嘴笑]

这是密码

# fake getting a file info object
#    in real life, use Get-Item or Get-ChildItem
$FileInfo = [System.IO.FileInfo]'PRT14_WD_14220000_1.jpg'

$BNParts = $FileInfo.BaseName.Split('_')
$BNParts[-1] = '00{0}' -f $BNParts[-1]
$NewBasename = $BNParts -join '_'

$NewFileName = $FileInfo.FullName.Replace($FileInfo.BaseName, $NewBaseName)

$NewFileName

output=
D:\Data\Scripts\PRT14\u WD\u 14220000\u 001.jpg

最接近您尝试的内容是这个。在正则表达式中,通配符是
*
。括号进行分组,以便稍后用美元符号编号引用

dir *.jpg | rename-Item -new { $_.name -replace '(.*)_(.*)_(.*)_','$1_$2_$3_00' } -whatif

What if: Performing the operation "Rename File" on target "Item: C:\users\admin\foo\PRT14_WD_14220000_1.jpg Destination: C:\users\admin\foo\PRT14_WD_14220000_001.jpg".
好的,当您需要最大两个零填充的数字时,这里是我的看法。$num必须是我想要的.tostring()方法的整数

dir *.jpg | rename-item -newname { $a,$b,$c,$num = $_.basename -split '_'
  $num = [int]$num
  $a + '_' + $b + "_" + $c + '_' + $num.tostring('000') + '.jpg'
} -whatif


最接近您尝试的是这个。在正则表达式中,通配符是
*
。括号用于分组,以便稍后使用美元符号数字进行引用

dir *.jpg | rename-Item -new { $_.name -replace '(.*)_(.*)_(.*)_','$1_$2_$3_00' } -whatif

What if: Performing the operation "Rename File" on target "Item: C:\users\admin\foo\PRT14_WD_14220000_1.jpg Destination: C:\users\admin\foo\PRT14_WD_14220000_001.jpg".
好的,当您需要最大两个零填充的数字时,这里是我的看法。$num必须是我想要的.tostring()方法的整数

dir *.jpg | rename-item -newname { $a,$b,$c,$num = $_.basename -split '_'
  $num = [int]$num
  $a + '_' + $b + "_" + $c + '_' + $num.tostring('000') + '.jpg'
} -whatif

上运行,而不是像您尝试使用的
*
(自身)那样

概念上更直接的方法是将替换集中在字符串的末尾:

Get-ChildItem | # `dir` is a built-in alias for Get-ChildItem`
  Rename-Item -NewName { $_.Name -replace '(?<=_)[^_]+(?=\.)', '00$&' } -WhatIf
  • 作为替换操作数的脚本块(
    {…}
    )将每个匹配项作为存储在自动变量
    $\uuu
    中的实例接收,其
    .Value
    属性包含捕获的文本

  • 在捕获的文本
    0
    上调用
    .PadLeft(3,'0')
    -left将其填充到3位并输出结果,这将替换当前的正则表达式匹配

快速演示:

PS> 'PRT14_WD_14220000_1.jpg' -replace '(?<=_)[^_]+(?=\.)', { $_.Value.PadLeft(3, '0') }
PRT14_WD_14220000_001.jpg # Note how '_1.jpg' was replaced with '_001.jpg'
上运行,而不是像您尝试使用的
*
(自身)那样

概念上更直接的方法是将替换集中在字符串的末尾:

Get-ChildItem | # `dir` is a built-in alias for Get-ChildItem`
  Rename-Item -NewName { $_.Name -replace '(?<=_)[^_]+(?=\.)', '00$&' } -WhatIf
  • 作为替换操作数的脚本块(
    {…}
    )将每个匹配项作为存储在自动变量
    $\uuu
    中的实例接收,其
    .Value
    属性包含捕获的文本

  • 在捕获的文本
    0
    上调用
    .PadLeft(3,'0')
    -left将其填充到3位并输出结果,这将替换当前的正则表达式匹配

快速演示:

PS> 'PRT14_WD_14220000_1.jpg' -replace '(?<=_)[^_]+(?=\.)', { $_.Value.PadLeft(3, '0') }
PRT14_WD_14220000_001.jpg # Note how '_1.jpg' was replaced with '_001.jpg'

这是有效的。谢谢。接下来的问题,我的名字的结尾总是需要3个字符。如果我的起始整数在结尾是两位数,我该如何处理这个问题?我会有一些文件是一位数的,其他的是两位数的。所以如果它以“_11.jpg”开头,我需要它是“_011.jpg”,但如果它是“_5.jpg”,我需要它是“_005.jpg”?我使用-split和.tostring()将以完全不同的方式完成。你能把它添加到问题中吗?这很有效。谢谢。接下来的问题,我的名字的结尾总是需要3个字符。如果我的起始整数是两位数,我将如何处理这个问题?我将有一些文件是一位数,而其他文件是两位数。因此,如果它以“_11.jpg”开头,我将需要它是“_011.jpg”,但如果它是“_5.jp”我需要它是“_005.jpg”?我会用一种完全不同的方式使用-split和.tostring()。你能把它添加到问题中吗?