首页 > 解决方案 > 如何从数组中获取多个文件夹中的所有文件

问题描述

我有一系列路径

$to_delete = @(
"D:\test\to_delete\", 
"E:\test\to_delete\", 
"F:\test\to_delete\"
)

我需要选择这些文件夹中的文件,然后如果满足条件,我将从其中一个文件夹中删除一个文件,并将新创建的文件放入“新建”文件夹中的同一驱动器中

$final_dir = @(
"D:\test\new\",
"E:\test\new\",
"F:\test\new\"
)

请注意,这些文件夹的名称可能不同。

所以我到目前为止是:

$number = 0
$window_title = $host.UI.RawUI.WindowTitle
while($true){
    $new_file = Get-ChildItem -Path C:\zips\ -Filter *.zip | Select-Object -First 1
    if ($new_file.count -gt 0){
        $number++
          $move_to = $number % $to_delete.count
          $delete = Get-ChildItem -Path $to_delete[$move_to] | Select-Object -First 1
          write-host "Deleting, $($delete.fullname)"
          Remove-Item -Path $delete.fullname -Force
    
          write-host "Moving #$($number), $($new_file)"
          Move-Item -Path $new_file.fullname -Destination $final_dir[$move_to] -force
          write-host "Finished moving"
          write-host "Moved files: $($number)"
    
          $host.UI.RawUI.WindowTitle = "$($window_title) -- moved $($number) files --"
    }
    Start-Sleep -s 10
}

现在,您可能已经注意到的问题是选择删除文件时。如果该文件夹中没有文件,则应尝试其他驱动器。仅使用$move_to变量,因此它不会一次填充一个驱动器。如果不可能,我愿意不使用它。但是我仍然会遇到选择删除文件的问题,因为我无法扫描所有文件夹以找到下一个要删除的文件,并且需要将新文件放入相应驱动器的文件夹中。


-C:\zips文件夹是新创建的文件所在的位置,首先脚本应该从文件夹$ to_delete中删除一个文件,并将新文件放入相应的$final_dir


另外,我想知道这是否会从执行下一行直到移动完成?

标签: powershell

解决方案


[cmdletbinding()]
param()

$folder_pairs = @(
    @{
        to_delete = 'C:\temp\move_delete_test\to_delete\1'
        final_dir = 'C:\temp\move_delete_test\new\1'
    },
    @{
        to_delete = 'C:\temp\move_delete_test\to_delete\2'
        final_dir = 'C:\temp\move_delete_test\new\2'
    },
    @{
        to_delete = 'C:\temp\move_delete_test\to_delete\3'
        final_dir = 'C:\temp\move_delete_test\new\3'
    }
)

$zipFolder = 'C:\temp\move_delete_test\zipfiles'

# 1..5 | ForEach-Object { $folder_pairs | Get-Random | ForEach-Object { New-Item -Path $_.to_delete -Name "test_$(Get-Random).txt" } }
# 1..5 | ForEach-Object { New-Item -Path $zipFolder -Name "$(Get-Random).zip" }

$window_title = $host.UI.RawUI.WindowTitle
$number = 0

while ($true) {
    if ($zipFile = Get-ChildItem $zipFolder -Filter *.zip | Select-Object -First 1) {
        Write-Verbose "Zip File: $($zipFile.FullName)"
        while (-not ($fp = $folder_pairs | Where-Object { ($script:file_to_delete = Get-ChildItem -Path $_.to_delete | Select-Object -First 1) } | Select-Object -First 1) ) {
            Start-Sleep -Seconds 1
        }

        Write-Verbose "Delete: $($file_to_delete.FullName)"
        Remove-Item $file_to_delete.FullName -Force

        Write-Verbose "Move Zip to $($fp.final_dir)"
        $zipFile | Move-Item -Destination $fp.final_dir -Verbose

        $host.UI.RawUI.WindowTitle = "$($window_title) -- moved $((++$number)) files --"
    }
    Start-Sleep -Seconds 10
}


推荐阅读