powershell - 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" }
这是我目前正在使用的代码。所以问题是重命名应该是这样的:
由此:
- RX 保险营销解决方案 PPLLC - Benjamin Frizner - Anthony Tolton - PA - 疼痛、疤痕、皮炎和肌肉松弛剂 - Lidocaine_Tetracaine 7%_7% Cream
- RX 保险营销解决方案 PPLLC - Benjamin Frizner - Anthony Tolton - PA - 肌肉松弛剂 - 氯唑沙宗 250 毫克片剂
- RX 保险营销解决方案 PPLLC - Benjamin Frizner - Anthony Tolton - PA - 牛皮癣 - Fluovix
- RX 保险营销解决方案 PPLLC - Benjamin Frizner - Anthony Tolton - PA - SCAR - Silivex 垫
对此:
- RX IMS-PPLLC - Dr. Frizner - Anthony Tolton - PA - 疼痛 - Lidocaine Tetracaine 7% 7% Cream
- RX IMS-PPLLC - Dr. Frizner - Anthony Tolton - PA - 肌肉松弛剂 - 氯唑沙宗 250 毫克片剂
- RX IMS-PPLLC - Dr. Frizner - Anthony Tolton - PA - 皮炎 - Fluovix
- RX IMS-PPLLC - Dr. Frizner - Anthony Tolton - PA - 疤痕 - Silivex 垫
所以问题是在PowerShell中运行脚本/代码后它工作正常,然后一些文件被重命名如下:
- RX IMS-PPLLC - 博士.......................... ..................................................... ................... Frizner - Anthony Tolton - PA - 疼痛 - 利多卡因丁卡因 7% 7% 奶油
- RX IMS-PPLLC - 博士.......................... ..................................................... ..................................................... ...... Frizner - Anthony Tolton - PA - 疤痕 - Silivex 垫
其他人会正常重命名,因为它们应该是。
这是我在 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}' }
解决方案
相反,或者一遍又一遍地使用Get-ChildItem
(Rename-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 代码更具可读性。
推荐阅读
- c# - Excel 工作表更改事件仅在 VBA 宏运行后才在单元格更改时触发
- elasticsearch - ElasticSearch post_filter 和过滤聚合的行为方式不同
- xpages - XPages extlib 移动控件中包含的按钮的 onComplete 不会在移动设备上触发,但在桌面浏览器中可以正常工作
- ios - 单击后从 Cell 推送 segue 不起作用
- javascript - 使用 React 创建可重用过滤表的问题
- c# - 为不同的输入和输出设置 Mock 对象方法,警告:访问修改后的闭包
- c# - 在身份服务器上检查 JWT 的有效性
- sql - SQL获取列表中值的MAX()值
- python - 通过 Gunicorn 运行时,Flask 在模板文件夹中找不到 HTML 文件
- mysql - 带有子查询和连接的 MySQL UPDATE