【问题标题】:How can I sync Folders from a Serverfile to a client computer with powershell?如何使用 powershell 将 Serverfile 中的文件夹同步到客户端计算机?
【发布时间】:2019-10-09 22:41:45
【问题描述】:

自从我将计算机上的同步中心升级到 W10 后,我的计算机上的同步中心出现了一些问题,因此我尝试编写一个替代脚本来比较桌面上的同步文件夹/文件和我们的 ServerFiles 并复制每个文件夹的最新版本/用户计算机上的文件。

感谢社区,我找到了一些代码,但对我来说效果不佳

Help1Help2

我是使用 powershell 5.1 编写脚本的新手。我正在使用 WS2008 和 W10 上的桌面。

$SourceFolder = Get-ChildItem -Recurse "\\Srvfiles\USERS\user1\"
#"user1" contains 2 folders and each one have subfolders/files 

$TargetFolder = Get-ChildItem "D:\Doc_Sync"

$Result = Compare-Object $SourceFolder $TargetFolder -Property Name, Length 

foreach ($folder in $Result) {
        if ($folder.SideIndicator -eq "<=") {
            $FullSourceObject = $folder.InputObject.FullName
            $FullTargetObject = $folder.InputObject.FullName.Replace($SourceFolder, $TargetFolder)

            Copy-Item "\\Srvfiles\USERS\user1\$($_.name)" -Destination $Get-ChildItem "D:\Doc_Sync" -Recurse -Force
            }
        }

好消息是它适用于某些文件夹,在 D:/Doc_Sync 上它粘贴了大部分文件但是(坏新),对于其余的文件,我遇到了很多错误:

Cannot bind argument to parameter « DifferenceObject » because it is null.
At line:5 char:40
+ $Result = Compare-Object $SourceFolder $TargetFolder -Property Name,  ...
+                                        ~~~~~~~~~~~~~
    + CategoryInfo          : InvalidData : (:) [Compare-Object], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.CompareObjectCommand

You cannot call a method on a null-valued expression.
At line:10 char:13
+             $FullTargetObject = $folder.InputObject.FullName.Replace( ...
+             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation : (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

感谢您的帮助

【问题讨论】:

  • 错误信息非常清楚!您的变量 $Targetfolder 和 $folder 为空(空)
  • @guiwhatsthat 感谢您的快速回答。如果 $Targetfolder 和 $folder 为空,为什么它会复制一些文件而一些不复制?
  • 不是文件夹变量为空,它不包含名为 InputObject 的属性。如果您使用的文件夹为空,则另一个变量可以为空。
  • 使用断点来调试你的脚本,这样你就会看到你的变量到底是什么

标签: powershell sysadmin


【解决方案1】:

感谢断点,我发现第一个错误有什么问题。我像这样更改了 $TargetFolder:

$TargetFolder = @(Get-ChildItem -Recurse "D:\Doc_Sync")

但我仍然遇到“$FullTargetObject”的第二个错误。我想知道那条线有什么问题......我会在这个周末工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    相关资源
    最近更新 更多