我正在尝试使用逗号分隔值重命名PDF文件。当我的所有PDF都在一个文件夹中时,以下脚本有效:
$myHeader = echo fileName newName
Import-Csv $PSScriptRoot\list_names.txt -Header $myHeader | foreach {
if (Test-Path -Path $PSScriptRoot\*.pdf) {
Rename-Item $_.fileName $_.newName
}
}
但是,在将PDF重组为子文件夹后,由于PDF文件的路径现在为$PSScriptRoot\subfolder1\*.pdf
或$PSScriptRoot\subfolder2\*.pdf
等,因此脚本不再有效。
Test-Path
无法使用子文件夹,我也尝试使用Get-ChildItem
和其他命令更改脚本无效。我不确定如何修复此脚本以使用子文件夹。
编辑:我只有CSV中的文件名。它只有两列:
"oldfilename.pdf","newfilename.pdf"
答案 0 :(得分:4)
如果您知道所有感兴趣的文件都直接位于脚本文件夹的直接子文件夹中,您可以使用Resolve-Path
查找每个感兴趣的文件:
$myHeader= 'fileName', 'newName'
Import-Csv $PSScriptRoot\list_names.txt -Header $myHeader | ForEach-Object {
if ($file = Resolve-Path "$PSScriptRoot\*\$($_.filename)") {
Rename-Item $file $_.newName -WhatIf
}
}
如果在任何直接子文件夹中找不到匹配的文件,则Resolve-Path
调用不输出任何内容,并且未输入if
块。如果匹配,则会将其分配给变量$file
,并输入if
块。
-WhatIf
之前的重命名操作;删除它以执行实际重命名。
相反,如果感兴趣的文件可以位于脚本文件夹子树中的任何位置,请使用Maxime Franchot's helpful answer。
答案 1 :(得分:2)
这就是我想出的。它将CSV内容放入具有Key = OldName,Value = NewName的哈希表中。然后,它将遍历根路径中的所有子文件夹。如果需要,您可以使用-exclude
或-include
参数,或删除-recurse
参数等,以使搜索更快,更精确。
$CSVHashTable = @{}
Import-CSV $PSScriptRoot\list_names.txt |
%{$CsvHashTable.Add($_.FileName, $_.NewName)}
Get-ChildItem -Path $PSScriptRoot -File -Recurse |
?{$CsvHashTable.ContainsKey($_.Name)} |
Rename-Item {$CsvHashTable.Item($_.Name)}
答案 2 :(得分:0)
使用像这样构建的csv
ss1.pdf,tt1.pdf
Sub1\ss2.pdf,tt2.pdf
Sub1\Sub2\ss3.pdf,tt3.pdf
以下脚本可以正常完成工作。
function Rename-Pdfs($Path,$items) {
foreach ($item in $items) {
$OldName = $Path + $item.fileName
if (Test-Path $OldName) {
Rename-Item $OldName $item.newName
}
}
}
$myHeader = echo fileName newName
$csv = Import-Csv 'C:\__tmp\MyCSV.csv' -Header 'fileName','newName'
Rename-Pdfs -Path 'C:\__tmp\' -items $csv
不使用函数和PSScriptRoot
$items = Import-Csv 'C:\__tmp\MyCSV.csv' -Header 'fileName','newName'
foreach ($item in $items) {
$OldName = $PSScriptRoot + '\' + $item.fileName
if (Test-Path $OldName) {
Rename-Item $OldName $item.newName
}
}
请注意,在最后一个示例中,我修改了$ oldPath以包含原本缺少的反斜杠,该反斜杠未添加到PsScriptRoot而不是我的csv第一列(fileName)。
如果您仍然有问题,请尝试添加一些Write-Host命令,以便通过查看值来更深入地了解问题。