使用if()重命名子文件夹中的文件

时间:2017-09-05 01:01:03

标签: powershell pdf

我正在尝试使用逗号分隔值重命名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"

3 个答案:

答案 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命令,以便通过查看值来更深入地了解问题。