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

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

Я хотел бы использовать что-то похожее на следующее:

Get-ChildItem ".\" -Recurse | Where-Object { $_.Name -like "*XYZ*"} | Move-Item -Force -Destination "C:\new\" | Rename-Item -NewName { $_.Name -replace 'XYZ','ABC' }

Файл перемещается, но не переименовывается. Разве я не могу передать move-item на rename-item?

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

Спасибо!

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Подкачка подразумевает два переименования, которые могут иметь место только с одним временным местоположением или временным именем.

ИМО одно временное имя проще.

#Requires -Version 3.0
(Get-ChildItem ".\*XYZ*" -File -Recurse) | ForEach-Object {
    $Swap = $_.Replace("XYZ","ABC")
    If (Test-Path $Swap){
      Rename-Item $Swap -NewName "$Swap.bak"
      $_ | Rename-Item -NewName $Swap
      Rename-Item "$Swap.bak" -NewName $_.FullName
    } else {
      $_ | Rename-Item -NewName $Swap
    }
}
0 голосов
/ 30 октября 2018

По умолчанию Move-Item не будет передавать текущий объект по конвейеру.

Вы можете использовать переключатель -Passthru, чтобы получить эту функциональность:

Move-Item -Force -Destination "C:\new\" -Passthru

В качестве альтернативы вы можете вырезать Rename-Item, указав в качестве назначения Move-item файл:

Get-ChildItem ".\" -Recurse |
    Where-Object { $_.Name -like "*XYZ*"} |
    Move-Item -Force -Destination "C:\new\$($_.Name -replace 'XYZ','ABC')"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...