覆盖现有文件并重命名

时间:2019-05-23 20:50:04

标签: powershell

我正在尝试重命名文件Members.csv

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

-Force不起作用。如果hello2已经存在,则重命名将不会进行。

我发现此线程说我们必须使用Move-Item。但是我不确定如何将其合并到我的代码中。

rename-item and override if filename exists

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 个答案:

答案 0 :(得分:2)

-Force的{​​{1}}参数不允许您通过重命名另一个文件来替换现有文件。来自documentation

  

-强制

     

强制cmdlet重命名无法更改的项目,例如隐藏或只读文件或只读别名或变量。该cmdlet无法更改常量别名或变量。实施因提供商而异。有关更多信息,请参见about_Providers。

您已经发现,您需要使用Rename-Item,它的使用方式与您在第一个代码段中尝试使用Move-Item -Force的方式完全相同:

Rename-Item

请注意,如果在Get-ChildItem -Filter '*Members*.csv' | Where-Object { $_.LastWriteTime.GetDateTimeFormats()[44] -eq $today } | Move-Item -Destination "hello2.csv" -Force 之后有多个项目,则每个项目都将替换前一个项目,因此您实际上将最终删除其中一个项目。