Powershell - 查找并移动具有特定扩展名的文件,同时保留文件夹结构

Powershell - 查找并移动具有特定扩展名的文件,同时保留文件夹结构

我的文件服务器有很多分散的视频文件。

我试图将它们存档到单独的服务器。但是我需要在新服务器中保留每个文件的文件路径/文件夹结构。

例子:

get-childitem "D:\*" -Filter *.mp4 -recurse

这将返回所有扩展名为 .mp4 的文件及其文件夹路径。

但是我怎样才能只复制所述 .mp4 文件,忽略所有其他文件,但复制它们的目录和父目录?

如果文件驻留在此处,例如:目录:

D:\操作系统和软件\程序\Security+\AAA 和身份验证 - CompTIA Security+ SY0-501 - 4.1.mp4

我想在 A: 中重新创建文件夹结构,但只复制 .mp4 文件。这意味着脚本会重新创建文件夹结构,但会忽略上述文件夹中存在的所有文件(mp4 文件除外),这些文件将被复制到文件夹结构中的相应子文件夹中。

答案1

你可以使用类似下面的方法来实现这一点:

get-childitem "D:\*" -Filter *.mp4 -recurse | foreach-object {

    $source = $_.FullName
    $target = $Source.Replace("D:\", "A:\")

    Copy-Item -LiteralPath $source -Destination $target -Force
}

如果源中没有 mp4 文件,该脚本将不会为将变为空的文件夹创建文件夹结构,但它会将 mp4 文件放置在目标中的正确位置并在需要时创建文件夹。

您还可以使用move-item将它们移离源位置。只需替换copy-item为 即可move-item。我假设是复制,因为这是您的问题所要求的。

答案2

如果不存在的话,这将创建必要的文件夹:

get-childitem "D:\*" -Filter *.mp4 -recurse | ForEach{
    $TargetPath = $_.DirectoryName -replace ('^C','A')
    If (!(Test-Path $TargetPath)) {
        mkdir $TargetPath | out-null
    }
    $_ | Copy-Item -Destination $TargetPath
}
 

相关内容