Перезаписать существующий файл и переименовать - PullRequest
0 голосов
/ 23 мая 2019

Я пытаюсь переименовать файл Members.csv.

Get-ChildItem ".\" -Filter '*Members*.csv' | where {
    $_.LastWriteTime.GetDateTimeFormats()[44] -eq $today
} | Rename-Item -NewName "hello2.csv" -Force

-Force не работает. Если hello2 уже существует, переименование не произойдет.

Я нашел эту ветку, в которой говорится, что мы должны использовать Move-Item. но я не уверен, как включить это в мой код.

переименовать элемент и переопределить, если имя файла существует

Get-ChildItem index.*.txt | ForEach-Object {
    $NewName = $_.Name -replace "^(index\.)(.*)",'$2'
    $Destination = Join-Path -Path $_.Directory.FullName -ChildPath $NewName
    Move-Item -Path $_.FullName -Destination $Destination -Force
}

Я не пытаюсь заменить, я переименовываю все имя, поэтому я не знаю, что делать с этой частью:

$NewName = $_.Name = "hello2"

1 Ответ

2 голосов
/ 24 мая 2019

Параметр -Force в Rename-Item не позволяет заменить существующий файл, переименовав другой. Из документации :

-Force

Принуждает командлет переименовывать элементы, которые нельзя изменить, например скрытые или доступные только для чтения файлы или псевдонимы или переменные только для чтения. Командлет не может изменять постоянные псевдонимы или переменные. Реализация варьируется от поставщика к поставщику. Для получения дополнительной информации см. About_Providers.

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

Get-ChildItem -Filter '*Members*.csv' | Where-Object {
    $_.LastWriteTime.GetDateTimeFormats()[44] -eq $today
} | Move-Item -Destination "hello2.csv" -Force

Имейте в виду, что если после Where-Object у вас будет более одного предмета, каждый из них заменит предыдущий, так что в итоге вы фактически удалите все, кроме одного.

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