我的文件服务器有很多分散的视频文件。
我试图将它们存档到单独的服务器。但是我需要在新服务器中保留每个文件的文件路径/文件夹结构。
例子:
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
}