复制项目并进行多重过滤

复制项目并进行多重过滤

如何使用具有多个过滤值的副本?

例如,如果我仅指定 1 个值进行过滤 (*.jpg),它就可以工作

Copy-Item -Path Y:\TEST -Recurse -Filter *.jpg -Destination D:\Users\MS5253\Desktop\Lots

这将创建一个仅包含 jpg 文件的文件夹(D:\Users\MS5253\Desktop\Lots\TEST)

但我也想过滤 xml 文件,我尝试了这个:

Copy-Item -Path Y:\TEST -Recurse -Filter *.jpg,*.xml -Destination D:\Users\MS5253\Desktop\Lots

它给了我一个错误。

和这个 :Copy-Item -Path Y:\TEST -Recurse -include "*.jpg","*.xml" -Destination D:\Users\MS5253\Desktop\Lots

它不起作用...

感谢您的帮助,我正在使用带有 Powershell v4 的 Windows 7。

答案1

如果希望将所有 jpg 和 xml 文件放入一个文件夹中,可以使用Get-ChildItem -Include

Get-ChildItem -Include *.jpg,*.xml -Recurse | ForEach-Object { 
    Copy-Item -Path $_.FullName -Destination D:\Users\MS5253\Desktop\Lots
}

答案2

如果您需要保留文件夹结构,似乎除了手动路径管理之外没有其他方法:

function Copy-Filtered {
    param (
        [string] $Source,
        [string] $Target,
        [string[]] $Filter
    )
    $ResolvedSource = Resolve-Path $Source
    $NormalizedSource = $ResolvedSource.Path.TrimEnd([IO.Path]::DirectorySeparatorChar) + [IO.Path]::DirectorySeparatorChar
    Get-ChildItem $Source -Include $Filter -Recurse | ForEach-Object {
        $RelativeItemSource = $_.FullName.Replace($NormalizedSource, '')
        $ItemTarget = Join-Path $Target $RelativeItemSource
        $ItemTargetDir = Split-Path $ItemTarget
        if (!(Test-Path $ItemTargetDir)) {
            [void](New-Item $ItemTargetDir -Type Directory)
        }
        Copy-Item $_.FullName $ItemTarget
    }
}

相关内容