Массовое переименование файлов Powershell с использованием списка ссылок Excel - PullRequest
0 голосов
/ 02 декабря 2018

Мне нужна помощь с PowerShell.

Мне придется начинать переименовывать файлы еженедельно, и я буду переименовывать более 100 в неделю или более, каждый из которых будет иметь динамическое имя.

Файлы, которые я хочу переименовать, находятся в папке с именем Сканирования , расположенной в папке "C: Documents \ Scans".И они были бы для того, чтобы сказать, время отсканировано.

У меня есть файл Excel, расположенный в "C: Documents \ Mapping \ New File Name.xlsx. В рабочей книге только один лист, а новые имена будут в столбце A с x строками. Как упомянуто выше над каждой ячейкойбудет иметь разные переменные.

P Арендуйте комментарии, чтобы прокомментировать ваши предложения, чтобы я мог понять, что происходит, поскольку я новичок в кодировании.

Спасибо всем за ваше время и помощь.

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Хотя я согласен с 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.."
}
0 голосов
/ 02 декабря 2018

Вы можете захотеть иметь 2 столбца в файле Excel:

  • оригинальное имя файла
  • имя целевого файла

Оттуда вы можете сохранитьфайл как CSV.

Используйте Import-Csv для перетаскивания данных в Powershell и цикл ForEach для циклического перемещения по каждой строке с помощью команды вроде move $ item.original $ item.target.

Существует множество потоков, описывающих использование import-csv с forEach.

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...