【发布时间】:2020-01-27 12:51:39
【问题描述】:
是否有可能构建一个脚本(例如 PowerShell),其中文件将根据特定文本用特定文本重命名?
我有数千个文件,例如:
-
12345_id_user.pdf
-
23456_id_user.pdf
-
34567_id_user.pdf
-
45678_id_user.pdf
等等
我需要用另一个特定的 id 更改第一部分(数字):
12345 → 98765
23456 → 87654
34567 → 76543
我有需要替换的新 id 和旧 id 的列表(excel/notepad/word)。
那么,是否可以创建一个脚本来查找名称“12345”并将其与新列表进行比较并更改为“98765”?
更新 2:
$Path = "C:\Users\oledv\Desktop\TestEnv\"
$Text = $arrExcelValuesA
#$PathArray = @()
#$Results = "C:\temp\test.txt"
function Release-Ref ($ref) {
([System.Runtime.InteropServices.Marshal]::ReleaseComObject([System.__ComObject]$ref) -gt 0)
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()
}
$arrExcelValuesA = @()
$objExcel = New-Object -ComObject Excel.Application
$objWorkbook = $objExcel.Workbooks.Open("C:\Users\oledv\Desktop\TestEnv\TestIds.xlsx")
$objWorksheet = $objWorkbook.Worksheets.Item(1)
Get-ChildItem $Path -Filter "*.pdf" | ForEach-Object {
$FileName = Get-Content $_.Name
Write-Output $FileName
$i = 1
do {
$arrExcelValuesA = $objWorksheet.Cells.Item($i, 1).Value()
$i++
} while ($FileName -eq $arrExcelValuesA)
$row = $objWorkSheet.Cells.Find($arrExcelValuesA).row
$col = $objWorkSheet.Cells.Find($arrExcelValuesA).column
$NewName = $objWorksheet.Cells.Item($row, $col+1).Value()+$arrExcelValuesA.Substring(5)
Rename-Item -Path $_.Name -NewName $NewName
}
它重命名第一个文件,但看起来它没有遍历文件夹中的所有文件...
Rename-Item :当该文件已存在时无法创建该文件。 在 C:\Users\oledv\Desktop\TestEnv\Check.ps1:40 char:18 + 重命名项目 - 路径 $_.Name -NewName $NewName + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : WriteError: (C:\Users\oledv\...456_id_user.pdf:String) [Rename-Item], IOException + FullyQualifiedErrorId : RenameItemIOError,Microsoft.PowerShell.Commands.RenameItemCommand Rename-Item :当该文件已存在时无法创建该文件。 在 C:\Users\oledv\Desktop\TestEnv\Check.ps1:40 char:18 + 重命名项目 - 路径 $_.Name -NewName $NewName + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : WriteError: (C:\Users\oledv\...567_id_user.pdf:String) [Rename-Item], IOException + FullyQualifiedErrorId : RenameItemIOError,Microsoft.PowerShell.Commands.RenameItemCommand Rename-Item :当该文件已存在时无法创建该文件。 在 C:\Users\oledv\Desktop\TestEnv\Check.ps1:40 char:18 + 重命名项目 - 路径 $_.Name -NewName $NewName + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : WriteError: (C:\Users\oledv\...678_id_user.pdf:String) [Rename-Item], IOException + FullyQualifiedErrorId : RenameItemIOError,Microsoft.PowerShell.Commands.RenameItemCommand Rename-Item :当该文件已存在时无法创建该文件。 在 C:\Users\oledv\Desktop\TestEnv\Check.ps1:40 char:18 + 重命名项目 - 路径 $_.Name -NewName $NewName + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : WriteError: (C:\Users\oledv\...789_id_user.pdf:String) [Rename-Item], IOException + FullyQualifiedErrorId : RenameItemIOError,Microsoft.PowerShell.Commands.RenameItemCommand Rename-Item :当该文件已存在时无法创建该文件。 在 C:\Users\oledv\Desktop\TestEnv\Check.ps1:40 char:18 + 重命名项目 - 路径 $_.Name -NewName $NewName + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : WriteError: (C:\Users\oledv\Desktop\TestEnv\xxxx.pdf:String) [Rename-Item], IOException + FullyQualifiedErrorId : RenameItemIOError,Microsoft.PowerShell.Commands.RenameItemCommand【问题讨论】:
-
你有明确的要求,也有策略去做。还请展示一些你已经尝试过的代码
-
您还需要确定您的列表格式,在这三种格式中,我建议使用纯文本格式,即记事本。然后您需要edit your question 来包含该文件的内容和布局示例。没有它,我们只能猜测。
-
@Theo 当然,我已经停在那里了......
-
@Compo 我决定试试excel
-
如果您从该 Excel 创建一个 CSV 文件并让它有两列,第一列是要查找的值,第二列是要替换它们的值(您的代码似乎只从 Excel 文件中读取一列)。有了这个,您可以简单地使用
-Filter参数获取与要查找的值匹配的目录中的文件,并使用第二列中的值重命名它们。
标签: powershell text replace