首页 > 解决方案 > PowerShell 不断在我的重命名中添加句点

问题描述

我使用的代码有问题。

cd "C:\Users\eulla\Documents\GAB\ZZZZ"
Get-ChildItem -Recurse | Rename-Item -NewName { $_.Name -replace "Insurance Marketing Solutions PPLLC","IMS-PPLLC" }
Get-ChildItem -Path "*Pain*" -File | Rename-Item -NewName {$_.Name -replace '(?<=\bPain\b).*(?= -)'}
Get-ChildItem -Recurse | Rename-Item -NewName { $_.Name -replace "PAIN","Pain" }
Get-ChildItem -Recurse | Rename-Item -NewName { $_.Name -replace "SCAR","Scar" }
Get-ChildItem -Recurse | Rename-Item -NewName { $_.Name -replace "DERMATITIS","Dermatitis" }
Get-ChildItem -Recurse | Rename-Item -NewName { $_.Name -replace "ANTI-FUNGAL","Anti-Fungal" }
Get-ChildItem -Recurse | Rename-Item -NewName { $_.Name -replace "METABOLIC","Metabolic " }
Get-ChildItem -Recurse | Rename-Item -NewName { $_.Name -replace "MUSCLE RELAXANT","Muscle Relaxant" }
Get-ChildItem -Recurse | Rename-Item -NewName { $_.Name -replace "ALLERGY","Allergy" }
Get-ChildItem -Recurse | Rename-Item -NewName { $_.Name -replace "Psoriasis","Dermatitis" }
Get-ChildItem -Recurse | Rename-Item -NewName { $_.Name -replace "PSORIASIS","Dermatitis" }
Get-ChildItem -Recurse | Rename-Item -NewName { $_.Name -replace "_"," " }
Get-ChildItem | Rename-Item -NewName { $_.Name -replace '(.*?)- \w+(.*)', '${1}- Dr.${2}' }
Get-ChildItem -Recurse | Rename-Item -NewName { $_.Name -replace "  "," " }
Get-ChildItem -Recurse | Rename-Item -NewName { $_.Name -replace "Dr. Wilson Hall","Dr. Hall" }
Get-ChildItem -Recurse | Rename-Item -NewName { $_.Name -replace "Dr. Foster Chapman","Dr. Chapman" }
Get-ChildItem -Recurse | Rename-Item -NewName { $_.Name -replace "Dr. Scott Hill","Dr. M Hill" }
Get-ChildItem -Recurse | Rename-Item -NewName { $_.Name -replace "Dr. Hill","Dr. S Hill" }

这是我目前正在使用的代码。所以问题是重命名应该是这样的:

由此:

对此:

所以问题是在PowerShell中运行脚本/代码后它工作正常,然后一些文件被重命名如下:

其他人会正常重命名,因为它们应该是。

这是我在 PowerShell 中遇到的错误:

重命名项目:找不到路径的一部分。
在行:14 字符:17
+ ... 子项 | 重命名项目 -NewName { $_.Name -replace '(.*?)- \w+(.*)', ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~
    + CategoryInfo : WriteError: (C:\Users\eulla\...Silivex Pad.pdf:String) [Rename-Item], DirectoryNotFoundException
    + FullyQualifiedErrorId : RenameItemIOError,Microsoft.PowerShell.Commands.RenameItemCommand

我不知道我正在使用的代码似乎有什么问题。

更新!!这是有问题的代码 Get-ChildItem | Rename-Item -NewName { $_.Name -replace '(.*?)- \w+(.*)', '${1}- Dr.${2}' }

标签: powershellrename

解决方案


相反,或者一遍又一遍地使用Get-ChildItemRename-Item让您陷入困境的一个原因),获取文件列表一次并使用新的计算名称重命名它们。

像这样的东西:

# create a Hashtable with all uppercase strings you want to replace
$upper2lower = @{
    'PAIN'            = 'Pain'
    'SCAR'            = 'Scar'
    'DERMATITIS'      = 'Dermatitis'
    'ANTI-FUNGAL'     = 'Anti-Fungal'
    'METABOLIC'       = 'Metabolic'
    'MUSCLE RELAXANT' = 'Muscle Relaxant'
    'ALLERGY'         = 'Allergy'
    'PSORIASIS'       = 'Dermatitis'  # shouldn't this be 'Psoriasis' ??
}

Get-ChildItem -Path "C:\Users\eulla\Documents\GAB\ZZZZ" -Recurse -File | ForEach-Object {
    $newName = $_.Name -replace "Insurance Marketing Solutions PPLLC","IMS-PPLLC"
    $newName = $newName -replace '(?<=\bPain\b).*(?= -)'
    # convert the uppercase stuff using the $upper2lower Hashtable
    foreach ($name in $upper2lower.Keys) {
        $newName = $newName -replace $name, $upper2lower[$name]
    }
    $newName = $newName -replace '_', ' ' -replace '(.*?)- \w+(.*)', '${1}- Dr.${2}' -replace '\s+', ' '

    # now do the names. because these have dots you need to escape for regex
    $newName = $newName -replace [regex]::Escape('Dr. Wilson Hall'),'Dr. Hall'
    $newName = $newName -replace [regex]::Escape('Dr. Foster Chapman'),'Dr. Chapman'
    $newName = $newName -replace [regex]::Escape('Dr. Scott Hill'),'Dr. M Hill'
    $newName = $newName -replace [regex]::Escape('Dr. Hill'),'Dr. S Hill'
    $newName = $newName -replace [regex]::Escape('Dr. Benjamin Frizner'), 'Dr. Frizner'

    # finally rename the file
    $_ | Rename-Item -NewName $newName -Force
}

PS1 第二个问题源于-replace使用正则表达式的事实,因此您需要转义任何在正则表达式中具有特殊含义的字符,例如点 ( .)

PS2 像$upper2lower哈希表一样,您也可以创建一个$doctors哈希表并放入所有名称,然后是替换名称。然后做一个foreach循环:

foreach ($doctor in $doctors.Keys) {
    $newName = $newName -replace [regex]::Escape($doctor), $doctors[$name]
}

当您周围有很多医生时,这有助于使 IMO 代码更具可读性。


推荐阅读