我遇到过这样的情况,文件服务器迁移没有成功,因为用户没有所有文件夹的权限。
因此,我有两个具有相同文件夹结构的服务器,但是由于用户已经在这些文件夹上工作过,因此我无法再次复制所有内容,因为它可能会复制用户已经删除的文件。
然而,我注意到一种模式,由于权限错误而未复制的文件夹在目标中留空。
因此,我通过搜索以下 powershell 脚本找到了它,该脚本列出了目标处的所有空文件夹:
(gci E:\Departments\Marketing -r | ? {$_.PSIsContainer -eq $True}) | ?{$_.GetFileSystemInfos().Count -eq 0} | select FullName
我一直在做的是访问文件夹,例如 E:\Departments\Marketing\ 并从 \oldserver\e$\departments\Marketing\ 复制
但有很多文件夹需要手动处理。
是否有人知道一个脚本可以将其与 foreach 嵌套以获取每个文件夹并从 UNC 路径复制数据并将其复制到新文件夹?
答案1
说实话,我还是不太明白你的意思,措辞让我很困惑。如果你有一台旧服务器,其文件结构与新服务器相同,那么你可以再次执行简单的复制。
- 使用
Copy-Item
你可以将它从 UNC 路径复制到本地路径,或者从会话复制到本地路径,或者从当地的远程路径(远程服务器)到系统上的本地路径。 - 在您的情况下,为了简单起见,您可以使用最后一个选项,因为这是相同的文件夹结构,并且从会话复制比通过 UNC 快得多。
- 如果已经有项目复制过来,除非您指定开关
-Force
,否则已经存在的匹配项目将不会被复制,而是会被跳过。
$CopyVal = @{
Path = 'E:\departments\Marketing\'
Destination = 'E:\departments\Marketing\'
Recurse = $true
ErrorAction = 'SilentlyContinue'
}
$PSSession = New-PSSession -ComputerName OldServer
Copy-Item -FromSession $PSSession @CopyVal
答案2
不要将结果通过管道传输到 Select 语句,而是将其通过管道传输到 ForEach,根据目标路径 ($_.FullName) 创建源路径,然后在 XCopy 命令中使用该结果,如下所示:
(gci "E:\Departments\Marketing" -r | ? {$_.PSIsContainer -eq $True}) | ?{$_.GetFileSystemInfos().Count -eq 0} | ForEach {
$Source = ($_.FullName -Replace 'E:\\Departments\Marketing','\\ServerName\SomeDir')
XCopy $Source $_.FullName /s
}