具有Excel参考列表的Powershell Mass重命名文件

时间:2018-12-02 16:40:14

标签: powershell

我需要有关PowerShell的帮助。

我将必须每周开始重命名文件,而我每周将重命名100个或更多具有动态名称的文件。

我要重命名的文件位于“ C:Documents \ Scans”中的文件夹名称 Scans 中。可以说是为了时间扫描。

我在“ C:Documents \ Mapping \ New File Name.xlsx”中有一个excel文件。 该工作簿只有一张工作表,新名称将在A列中包含x行。就像上面提到的那样,每个单元格都有不同的变量。

P Lease对您的建议进行评论,以便我了解编码的最新情况。

感谢大家的时间和帮助。

2 个答案:

答案 0 :(得分:0)

您可能希望在excel文件中有2列:

  • 原始文件名
  • 目标文件名

从那里您可以将文件另存为csv。

使用Import-Csv将数据提取到Powershell中,并使用诸如move $ item.original $ item.target之类的命令将ForEach循环遍历每一行。

有很多线程描述了如何将import-csv与forEach一起使用。

祝你好运。

答案 1 :(得分:0)

尽管我同意Ad Kasenally的看法,使用CSV文件会更容易,但是有些方法可能对您有用。

$excelFile   = 'C:\Documents\Mapping\New File Name.xlsx'
$scansFolder = 'C:\Documents\Scans'

########################################################
# step 1: get the new filenames from the first column in
# the Excel spreadsheet into an array '$newNames'
########################################################
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false
$workbook  = $excel.Workbooks.Open($excelFile)
$worksheet = $workbook.Worksheets.Item(1)

$newNames = @()
$i = 1
while ($worksheet.Cells.Item($i, 1).Value() -ne $null) {
    $newNames += $worksheet.Cells.Item($i, 1).Value()
    $i++
}

$excel.Quit
# IMPORTANT: clean-up used Com objects
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($worksheet) | Out-Null
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($workbook) | Out-Null
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()

########################################################
# step 2: rename the 'scan' files
########################################################
$maxItems = $newNames.Count
if ($maxItems) {
    $i = 0
    Get-ChildItem -Path $scansFolder -File -Filter 'scan*' |      # get a list of FileInfo objects in the folder
        Sort-Object { [int]($_.BaseName -replace '\D+', '') } |   # sort by the numeric part of the filename
        Select-Object -First ($maxItems) |                        # select no more that there are items in the $newNames array
        ForEach-Object {
            try {
                Rename-Item -Path $_.FullName -NewName $newNames[$i] -ErrorAction Stop
                Write-Host "File '$($_.Name)' renamed to '$($newNames[$i])'"
                $i++
            }
            catch {
                throw
            }
        }
}
else {
    Write-Warning "Could not get any new filenames from the $excelFile file.."
}