Powershell - 移动在子文件夹上过滤的文件夹

Powershell - Move folder filtered on subfolders

我目前拥有的:

Get-ChildItem -Path "\Networkdrive\Folder1\PROD- TEST\Successful" -Recurse |
Where-Object name -match '\w{10}_\w{3}' |
Move-Item -destination "\Networkdrive\Folder1\Archive- TEST\Archive_PROD_TEST\Successful" -Verbose

在 : \Networkdrive\Folder1\PROD- TEST\Successful 的内部是如下所示的文件夹:9ce8eab8-cefe-4ec9-9158-ff40612d5c47 然后在其中有更多的文件夹,这些文件夹的标准是 10 个带下划线的数字 (_),然后是3 个号码。

我想移动 9ce8eab8-cefe-4ec9-9158-ff40612d5c47 文件夹,如果任何子文件夹包含 10 个字符后跟一个 _ 然后和其他 3 个字符到 \Networkdrive\Folder1\Archive- TEST\Archive_PROD_TEST\Successful 的条件,但我想保留结构和文件。

现在代码只是抓取里面的文件夹,然后移动它们,但单独留下 9ce8eab8-cefe-4ec9-9158-ff40612d5c47 文件夹。我也想9ce8eab8-cefe-4ec9-9158-ff40612d5c47搬家

假设名为 XXXXXXXXX_XXX 的文件夹是名为 XXXXXXX-XXXX-XXXX-XXXXXXXXXXXX 的文件夹的直接子文件夹,那么您可以:

  1. 找到符合您所需模式的文件夹,然后
  2. 获取这些对象的 Parent 属性。

例如,我会使用这个:

Get-ChildItem -Path "\Networkdrive\Folder1\PROD-TEST\Successful\*\*" -Directory |
Where-Object name -match '\w{10}_\w{3}' |
Get-ItemPropertyValue -Name Parent |
Move-Item -Destination "\Networkdrive\Folder1\Archive- TEST\Archive_PROD_TEST\Successful" -Verbose

请注意,仅当 XXXXXXXXXX_XXX 目录相对于需要移动的文件夹始终处于同一深度时,此简单策略才有效,因为 Parent 让您恰好达到一个级别。

虽然不太清楚子文件夹的命名约定是什么(你说的是numbers),所以下面我使用的是这种模式:\d{10}_\d{3}.
但是,如果这些是十六进制数字,则需要使用模式 [0-9a-f]{10}_[0-9a-f]{3}

尝试:

$sourcePath    = '\Networkdrive\Folder1\PROD- TEST\Successful'
$destination   = '\Networkdrive\Folder1\Archive- TEST\Archive_PROD_TEST\Successful'
$folderPattern = '^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$'
$subdirPattern = '\d{10}_\d{3}'  # if the name must match FULLY, use anchors: '^\d{10}_\d{3}$'

Get-ChildItem -Path $sourcePath -Directory | Where-Object {$_.Name -match $folderPattern} | ForEach-Object {
    # capture the folders FullName for when we hit the catch block in case of error
    $targetFolder = $_.FullName
    if (@(Get-ChildItem -Path $targetFolder -Directory | Where-Object { $_.Name -match $subdirPattern }).Count) {
        # one or more subfolders found with name matching the $subdirPattern, so move the folder
        Write-Host "Moving folder '$targetFolder'"
        try {
            Move-Item -Path $targetFolder -Destination $destination -Force -ErrorAction Stop
        }
        catch {
            Write-Warning "Error moving folder '$targetFolder':`r`n$($_.Exception.Message)"
        }
    }
}