Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/409.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell移动和重命名文件_Powershell - Fatal编程技术网

Powershell移动和重命名文件

Powershell移动和重命名文件,powershell,Powershell,我需要交换一些文件的名称。这些文件位于同一位置,因此我计划将它们移动到临时场地,以避免有两个同名文件。我正试图根据名称参数识别文件,将其移动到临时场地并重命名 我想使用类似于以下内容的内容: Get-ChildItem ".\" -Recurse | Where-Object { $_.Name -like "*XYZ*"} | Move-Item -Force -Destination "C:\new\" | Rename-Item -NewName { $_.Name -replace 'X

我需要交换一些文件的名称。这些文件位于同一位置,因此我计划将它们移动到临时场地,以避免有两个同名文件。我正试图根据名称参数识别文件,将其移动到临时场地并重命名

我想使用类似于以下内容的内容:

Get-ChildItem ".\" -Recurse | Where-Object { $_.Name -like "*XYZ*"} | Move-Item -Force -Destination "C:\new\" | Rename-Item -NewName { $_.Name -replace 'XYZ','ABC' }
文件将移动,但不会重命名。我是否无法将
移动项目
传送到
重命名项目

我很高兴知道是否有更好的方法可以在不移动的情况下交换两个文件的文件名,但我也想知道为什么上面的方法不起作用


谢谢

默认情况下,
移动项目
不会沿管道传递当前对象

您可以使用
-Passthru
开关获得该功能:

Move-Item -Force -Destination "C:\new\" -Passthru
或者,您可以通过将
移动项目
目标设置为文件来剪切
重命名项目

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

交换意味着只能使用一个临时位置或临时名称进行两次重命名

在国际海事组织,一个临时名称更容易

#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
    }
}

我是否可以安全地假设,
-passthru
在任何时候出现错误,声称cmdlet无法沿管道传递对象时都可以工作?不确定tbh-它使用了很多,但不能肯定地说在所有cmdlet中都可以。最好的方法是在PowerShell中使用
Move Item
,例如
help Move Item
,或者进行检查