需要使用Powershell向文件名批量添加字符
我有一系列文件,它们的名称如下: PRT14_WD_14220000_1.jpg 我需要在最后一个下划线之后和数字之前添加两个零,使其看起来像PRT14_WD_14220000_001.jpg 我试过了”需要使用Powershell向文件名批量添加字符,powershell,filenames,Powershell,Filenames,我有一系列文件,它们的名称如下: PRT14_WD_14220000_1.jpg 我需要在最后一个下划线之后和数字之前添加两个零,使其看起来像PRT14_WD_14220000_001.jpg 我试过了” 感谢您的帮助。以下假定您的的最后一部分。BaseName始终需要添加两个零。它的作用是 伪造从get Item/get ChildItem 将其替换为适当的cmdlet。[grin] 将.BaseName拆分为多个部分,并使用\uu作为拆分目标 将两个零添加到上述拆分的最终零件 将部件合并到
感谢您的帮助。以下假定您的
的最后一部分。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
-left将其填充到3位并输出结果,这将替换当前的正则表达式匹配.PadLeft(3,'0')
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
-left将其填充到3位并输出结果,这将替换当前的正则表达式匹配.PadLeft(3,'0')
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()。你能把它添加到问题中吗?