PowerShell 脚本将文件移动到新目录中并重命名它们 - 如何避免重复冲突?

PowerShell 脚本将文件移动到新目录中并重命名它们 - 如何避免重复冲突?

情况如下。我有一个文件夹,每天都会转储文件(主要是 PDF)。我正在尝试编写一个执行以下操作的脚本:

  1. 浏览文件夹中的所有文件并将其移动到指定的新文件夹。
  2. 在移动文件时,需要将它们重命名为 DMF_3400_file_ID,这样它们就始终是唯一的。我发现,对于最终的 ID,我将使用当前日期 + 随机生成的 4 位数字,以确保名称始终是唯一的。重命名后,目标文件夹中的文件应具有如下名称:DMF_3400_file_140920211587。这是我目前所做的:
$FileLimit = 200 

$PickupDirectory = Get-ChildItem -Path "C:\test\Src1" | Select -First $FileLimit

$DropDirectory = "C:\test\Dest1"
$curDateTime = Get-Date -Format ddMMyyyy


foreach ($file in $PickupDirectory){
    $Destination = Join-Path $DropDirectory ($file.Name)

    $Num = Get-Random -maximum 9999
    $file | Move-Item -Destination $Destination -PassThru -Verbose |
    Rename-Item -NewName {"DMF_3400_file_" + $curDateTime + $Num + $_.Extension } -Force -Verbose    
}

脚本按我的要求运行,但问题是我仍然会不时遇到名称重复的情况,特别是当我移动大量文件时。我的问题是,如何更好地编写脚本以避免重复并确保所有文件都将被移动并且始终具有唯一的名称?我是 PowerShell 新手,因此非常感谢任何帮助!

答案1

您可以使用数组列表来调整代码,该数组列表将在 While 循环中保存唯一生成的随机数。然后,在 ForEach 循环中使用计数器在重命名文件时提取它们。

你的代码将如下所示:

$FileLimit = 200

#Create an arraylist that will hold the random numbers
$myArrayList = New-Object -TypeName "System.Collections.ArrayList"

While( $myArrayList.Count -le $FileLimit){

   $num = Get-Random -maximum 9999
   #Check if the arraylist doea not contain the random number
   If (!$myArrayList.contains($num)){ 
   #Add the random number if not found in the arraylist
      [void]$myArrayList.Add($num)
   }

}

$PickupDirectory = Get-ChildItem -Path "C:\users\reddylutonadio" -File | Select -First $FileLimit

$DropDirectory = "C:\test\Dest1"

$curDateTime = Get-Date -Format ddMMyyyy
#Counter to extract the random numbers
$counter = 0

foreach ($file in $PickupDirectory){
    $Destination = Join-Path $DropDirectory ($file.Name)
    
    $Num = Get-Random -maximum 9999 
    
    $file | Move-Item -Destination $Destination -PassThru | Rename-Item -NewName {"DMF_3400_file_" + $curDateTime + $myArrayList[$counter] + $_.Extension }    
    $counter += 1
}

相关内容