PowerShell - перебирать файлы и переименовывать - PullRequest
0 голосов
/ 13 ноября 2018

новичок здесь.Я пытаюсь написать сценарий PowerShell для:

  1. цикла по всем файлам в каталоге
  2. Элемент списка
  3. Получить все файлы .pdf ТОЛЬКО

    Переименуйте их - имена файлов длинные - более 30 символов - Они содержат 2 числа, которые мне нужно извлечь - Пример:

    Накопительное обновление 11 для Microsoft Dynamics NAV 2018 (сборка 25480) .pdf -> РЕЗУЛЬТАТ: = 18CU11.pdf

Я пробовал примеры с нескольких сайтов, и я не могу даже успешно выполнить цикл.Либо получите сообщение об ошибке - этот путь не существует, либо он не может переименовать файлы, поскольку каким-то образом цикл получает путь к файлу, и я не могу переименовать

Get-ChildItem "C:\Users\******\Desktop\PowerShell Practice" -Filter *.pdf |  #create list of files

ForEach-Object{
    $oldname = $_.FullName;
    $newname = $_.FullName.Remove(0,17); 
    #$newname = $_.FullName.Insert(0,"CU")

    Rename-Item $oldname $newname;

    $oldname;
    $newname;  #for testing
}

Это просто последняя попытка, но любые другие способыделать это будет хорошо - до тех пор, пока это делает работу.

Ответы [ 3 ]

0 голосов
/ 13 ноября 2018

Проверьте справку для Rename-Item . Параметр -NewName требует только имя файла , но не полный путь.

Попробуйте это:

Get-ChildItem "C:\Users\******\Desktop\PowerShell Practice-Filter" -Filter *.pdf |  #create list of files

ForEach-Object{
    $oldname = $_.FullName
    $newname = $_.Name.Remove(0,17)

    Rename-Item -Path $oldname -NewName $newname

    $oldname
    $newname  #for testing
}
0 голосов
/ 16 ноября 2018

Попробуйте эту логику:

[string]$rootPathForFiles = Join-Path -Path $env:USERPROFILE -ChildPath 'Desktop\PowerShell Practice'
[string[]]$listOfFilesToRename = Get-ChildItem -Path $rootPathForFiles -Filter '*.PDF' | Select-Object -ExpandProperty FullName
$listOfFilesToRename | ForEach-Object {
    #get the filename wihtout the directory
    [string]$newName = Split-Path -Path $_ -Leaf 
    #use regex replace to apply the new format
    $newName = $newName -replace '^Cumulative Update (\d+) .*NAV 20(\d+).*$', '$2CU$1.pdf' # Assumes a certain format; if the update doesn't match this expectation the original filename is maintained
    #Perform the rename
    Write-Verbose "Renaming '$_' to '$newName'" -Verbose #added the verbose switch here so you'll see the output without worrying about the verbose preference
    Rename-Item -Path $_ -NewName $newName 
}
0 голосов
/ 13 ноября 2018

Пожалуйста, попробуйте это

Get-ChildItem -Path "C:\Users\******\Desktop\PowerShell Practice-Filter" -Filter *.pdf | Rename-Item -NewName $newname
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...