如何使用Powershell移动和重命名多个文件?

时间:2019-08-19 12:55:56

标签: powershell

我有大量文件(> 400万个),需要重命名并将它们以小步移动到另一个文件夹中。

我是Powershell的初学者,但是我已经设法将它们移动到100个文件的小包装中(powershell脚本作为计划任务执行)。

但是到目前为止,我无法重命名文件。在每个文件中,有两个字符串需要替换。 除了重命名部分(第12和13行)以外,以下代码可以正常工作:

#Get 'n' number of files
$FileLimit = 100 

$PickupDirectory = Get-ChildItem -Path "\\server\path$\ERROR\subfolder\"
$DropDirectory = "\\server\path$\destination\"

$Counter = 0
foreach ($file in $PickupDirectory)
{
    if ($Counter -ne $FileLimit)
    {
        $file | Rename-Item -NewName {$_.name -replace '999999','367'}
        $file | Rename-Item -NewName {$_.name -replace 'oldname','newname'}

        $Destination = $DropDirectory+$file.Name

        Move-Item $file.FullName -destination $Destination
        $Counter++
    }  
}
exit

重命名这些文件的正确方法是什么?

非常感谢您的帮助! 最好的祝愿 菲利普

编辑:对不起,这是错误日志:

Rename-Item : Cannot rename because item at 'Microsoft.PowerShell.Core\FileSystem::\\server\path$\ERROR\subfolder\1566392#5990762$20180116^999999_2018_01_16_oldname_1566392_Kägi.pdf' does not exist.
At C:\Scripts\mv_Verordnung_für_Physiotherapie.ps1:12 char:28
+ ... pDirectory | Rename-Item -NewName {$_.name -replace '^999999','^367'}
+                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidOperation: (:) [Rename-Item], PSInvalidOperationException
+ FullyQualifiedErrorId : InvalidOperation,Microsoft.PowerShell.Commands.RenameItemCommand

Edit2:使用注释中的提示更新了代码。错误仍然相同。

2 个答案:

答案 0 :(得分:3)

您应该使用Get-ChildItem =>

进行限制(如有必要)。
$PickupDirectory = Get-ChildItem -Path "\\server\path$\ERROR\subfolder\" | Select -First $FileLimit
  1. 使用整个数组$PickupDirectory
  2. ,而不使用当前迭代的项目($ file)
  3. 您不能将2.替换应用于已更改的值。
  4. 一步一步地完成重命名和移动。
#Get 'n' number of files
$FileLimit = 100 

$PickupDirectory = Get-ChildItem -Path "\\server\path$\ERROR\subfolder\" | Select -First $FileLimit

$DropDirectory = "\\server\path$\destination\"

foreach ($file in $PickupDirectory){
    $Destination = Join-Path $DropDirectory ($file.Name -replace '^999999','^367' `
                                                        -replace 'oldname','newname')
    $file | Move-Item -Destination $Destination
}

答案 1 :(得分:1)

您正在呼叫Rename-Item集合上的$PickupDirectory。而是在$file循环中使用的foreach变量上调用它:

$file | Rename-Item -NewName { $_.name -replace '^999999', '^367' }
$file | Rename-Item -NewName { $_.name -replace 'oldname', 'newname' }