【问题标题】:PowerShell - bulk move of some subfolders to new serverPowerShell - 将一些子文件夹批量移动到新服务器
【发布时间】:2014-09-07 15:19:45
【问题描述】:
有人要求我将大约 200 个文件夹移动到新服务器,但我不确定如何编写脚本,或者是否可能。
我在目的地有一个重复的文件夹结构,但问题是我只需要移动每个父文件夹中的 1 个子文件夹及其内容。看起来像这样:
FolderA
Folder1
Folder2
FolderB
Folder1
Folder2
是否可以仅从文件夹 a-z 中移动“Folder1”并将“Folder1”放置在其相应的新父文件夹中?
【问题讨论】:
标签:
powershell
batch-processing
subdirectory
【解决方案1】:
我会使用 Robocopy,特别是如果您想保留所有权和权限。
【解决方案2】:
我很想使用RoboCopy 进行复制,因为您可以将其设置为带入原始文件的创建和修改日期和时间以及安全权限。
虽然它本身不能做 Folder1 的事情。所以我会考虑使用 PowerShell 生成 RoboCopy 命令的批处理文件,然后运行它。例如看起来像这样的东西,虽然我还没有测试过。
$sourceFolder = "\\server1\share"
$destFolder = "\\server2\share"
foreach ($folder in (Get-ChildItem -Directory $sourceFolder)) {
"robocopy `"$($sourceFolder)\$($folder)\Folder1`" `"$($destFolder)\$($folder)\Folder1`" /E /COPYALL /DCOPY:T" | Out-File roboscript.bat -Append
}
然后检查并运行roboscript.bat 进行复制。
【解决方案3】:
更多关于 TessellatingHeckler 代码的评论而不是这里的答案。由于他首先得到了答案,因此请给予他任何您认为归因于他的功劳。
由于您正在处理将字符串输出到文本文件,因此您可能希望使用字符串。关于您的 ForEach,我想建议:
foreach ($folder in (Get-ChildItem -Directory $sourceFolder | Select -ExpandProperty FullName)) {
$TargetFolder = $Folder -replace [regex]::Escape($sourceFolder), "$destFolder"
"robocopy `"$Folder\Folder1`" `"$TargetFolder\Folder1`" /E /COPYALL /DCOPY:T" | Out-File roboscript.bat -Append
}
选择相关文件夹的完整路径作为 ForEach 的一部分。然后它声明一个变量作为目标,在其中它用目标路径替换源路径(源被转义,因为这是一个正则表达式匹配)。这可能会使其更加灵活。
此外,您不需要以这种方式创建子表达式,因为它只是您要引用的字符串,而不是 [FileInfo] 对象。
最后,我想补充一点,如果您愿意,可以使用两个连续的双引号而不是转义它们,但我建议按照 TH 的建议转义它们。