使用 Rename-Item 使数字标识符和名称保持一致
Using Rename-Item to make numeric identifiers & names consistent
我有几千个这样分隔的文件名:
Last, First-000000-Title-MonYYYY.pdf
问题 1:一些文件符合 6 位数约定,而另一些文件则需要前导零以保持一致性。
问题 2:输入的某些名称带有破折号(有问题的是分隔符),需要这样连接:
最后-最后,第一个 > 最后最后,第一个
我能够为每个文件执行一个简单的 Rename-Item
函数,但无法创建更广泛的 Get-ChildItem
函数,考虑到文件名的多次迭代以生成一致的输出。
对于入门级问题,我深表歉意,但我似乎无法连贯地将所需的功能组合在一起。
根据您的解释:
Set-Location -Path "C:\path" # replace this with actual path to where the files are
$cFiles = Get-ChildItem -Filter "*.pdf" # Getting all PDFs in the folder
foreach ($oFile in $cFiles) {
$sName = $oFile.Name
# This regex captures 1-5 digits number between two dashes.
$sPattern = '(?:(?<=-))(\d{1,5})(?:(?=-))'
if ($sName -match $sPattern) {
# Extracting number.
[UInt32]$iNumber = $sName -replace (".*" + $sPattern + ".*"), ''
# Padding number with zeros.
$sNumber = "{0:D6}" -f $iNumber
# Updating filename string.
$sName = $sName -replace $sPattern, $sNumber
} else {
# This regex captures 6 digits number between two dashes.
$sPattern = '.*-(\d{6})-.*'
# Extracting number.
$sNumber = $sName -replace $sPattern, ''
}
# Splitting filename string on 6 digits number.
$cParts = $sName -split $sNumber
# Removing dashes from first/last names and re-assembling filename string.
$sName = ($cParts[0] -replace '-') + '-' + $sNumber + $cParts[1]
Rename-Item -Path $oFile.Name -NewName $sName
}
在以下样本上测试:
Last, First-000000-Title-Jan1900.pdf
One-Two, Three-123-Title-Feb2000.pdf
Four, Five-Six-456-Title-Mar2010.pdf
Seven-Eight, Nine-Ten-7890-Title-Sep2012.pdf
如果有更复杂的情况,可能无法工作。
我有几千个这样分隔的文件名:
Last, First-000000-Title-MonYYYY.pdf
问题 1:一些文件符合 6 位数约定,而另一些文件则需要前导零以保持一致性。
问题 2:输入的某些名称带有破折号(有问题的是分隔符),需要这样连接: 最后-最后,第一个 > 最后最后,第一个
我能够为每个文件执行一个简单的 Rename-Item
函数,但无法创建更广泛的 Get-ChildItem
函数,考虑到文件名的多次迭代以生成一致的输出。
对于入门级问题,我深表歉意,但我似乎无法连贯地将所需的功能组合在一起。
根据您的解释:
Set-Location -Path "C:\path" # replace this with actual path to where the files are
$cFiles = Get-ChildItem -Filter "*.pdf" # Getting all PDFs in the folder
foreach ($oFile in $cFiles) {
$sName = $oFile.Name
# This regex captures 1-5 digits number between two dashes.
$sPattern = '(?:(?<=-))(\d{1,5})(?:(?=-))'
if ($sName -match $sPattern) {
# Extracting number.
[UInt32]$iNumber = $sName -replace (".*" + $sPattern + ".*"), ''
# Padding number with zeros.
$sNumber = "{0:D6}" -f $iNumber
# Updating filename string.
$sName = $sName -replace $sPattern, $sNumber
} else {
# This regex captures 6 digits number between two dashes.
$sPattern = '.*-(\d{6})-.*'
# Extracting number.
$sNumber = $sName -replace $sPattern, ''
}
# Splitting filename string on 6 digits number.
$cParts = $sName -split $sNumber
# Removing dashes from first/last names and re-assembling filename string.
$sName = ($cParts[0] -replace '-') + '-' + $sNumber + $cParts[1]
Rename-Item -Path $oFile.Name -NewName $sName
}
在以下样本上测试:
Last, First-000000-Title-Jan1900.pdf
One-Two, Three-123-Title-Feb2000.pdf
Four, Five-Six-456-Title-Mar2010.pdf
Seven-Eight, Nine-Ten-7890-Title-Sep2012.pdf
如果有更复杂的情况,可能无法工作。