Powershell 脚本仅将数据复制到目标上为空的文件夹中

Powershell 脚本仅将数据复制到目标上为空的文件夹中

我遇到过这样的情况,文件服务器迁移没有成功,因为用户没有所有文件夹的权限。

因此,我有两个具有相同文件夹结构的服务器,但是由于用户已经在这些文件夹上工作过,因此我无法再次复制所有内容,因为它可能会复制用户已经删除的文件。

然而,我注意到一种模式,由于权限错误而未复制的文件夹在目标中留空。

因此,我通过搜索以下 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
}

相关内容