在robocopy期间遍历samba共享并排除一些

时间:2018-09-01 18:07:40

标签: powershell cmd share samba robocopy

我使用Robocopy将Samba共享备份到本地驱动器,反之亦然。 要将远程共享与本地文件夹同步,我使用PS脚本

$Path = Split-Path "\\192.168.1.100\asuscloud\*"
$Dest = "E:\back_fold\asuscloud\"
robocopy $Path $Dest /B /MT:64 /IS /Z /FP /MIR /TEE /NP /FP /NDL

要排除某些子文件夹,可以使用/XD开关

$Path = Split-Path "\\192.168.1.100\asuscloud\*"
$Dest = "E:\back_fold\asuscloud"
robocopy $Path $Dest /B /MT:64 /IS /Z /FP /MIR /TEE /NP /FP /NDL /XD "\\192.168.1.100\asuscloud\subdir"

但是,此语法不适用于主机和该主机的共享

$Path = Split-Path "\\192.168.1.100\*"
$Dest = "E:\back_fold\"
robocopy $Path $Dest /B /MT:64 /IS /Z /FP /MIR /TEE /NP /FP /NDL /XD "\\192.168.1.100\asuscloud\"

它抛出

  

-------------------------------------------------- ------------------------------->-

     

ROBOCOPY :: Windows的可靠文件复制

     

开始时间:2018年9月1日星期六晚上8:46:23     来源:D:\ back_fold \       目的地-

     

文件:

     

Exc Dirs:\ 192.168.1.100 \ asuscloud

     

选项: / FP / NDL / TEE / DCOPY:DA / COPY:DAT / Z / NP / IS / MT:64 / R:1000000 / W:30

     
     

错误:未指定目标目录。

我要排除主机的两个共享,并将其他共享同步到本地文件夹。

enter image description here

如何实现?

更新:nbtstat -A 192.168.1.100

C:\Windows\system32>nbtstat -A 192.168.1.100

Ethernet:
Node IpAddress: [0.0.0.0] Scope Id: []

    Host not found.

Ethernet 2:
Node IpAddress: [0.0.0.0] Scope Id: []

    Host not found.

Bluetooth Network Connection:
Node IpAddress: [0.0.0.0] Scope Id: []

    Host not found.

Wi-Fi:
Node IpAddress: [192.168.1.105] Scope Id: []

           NetBIOS Remote Machine Name Table

       Name               Type         Status
    ---------------------------------------------
    PASCAL         <00>  UNIQUE      Registered
    PASCAL         <03>  UNIQUE      Registered
    PASCAL         <20>  UNIQUE      Registered
    ☺☻__MSBROWSE__☻<01>  GROUP       Registered
    WORKGROUP      <1E>  GROUP       Registered
    WORKGROUP      <00>  GROUP       Registered
    WORKGROUP      <1D>  UNIQUE      Registered
    WORKGROUP      <1B>  UNIQUE      Registered

    MAC Address = 00-00-00-00-00-00


Local Area Connection* 3:
Node IpAddress: [0.0.0.0] Scope Id: []

    Host not found.

NET VIEW \\ 192.168.1.100

C:\Windows\system32>NET VIEW \\192.168.1.100
Shared resources at \\192.168.1.100

Pascal

Share name  Type  Used as  Comment

-------------------------------------------------------------------------------
asuscloud   Disk           data's asuscloud in External USB3.0
backup      Disk           data's backup in External USB3.0
downloads   Disk           data's downloads in External USB3.0
dropbox     Disk           data's dropbox in External USB3.0
entware     Disk           data's entware in External USB3.0
os          Disk           data's os in External USB3.0
The command completed successfully.

2 个答案:

答案 0 :(得分:1)

这不会在远程主机上动态找到共享,但是它允许您指定要从中复制的SHARENAME。

我认为您的基本误解是仅主机名(或IP地址)不是路径。它也必须有一个SHARENAME。

如果将其另存为Do-It.ps1,则要查看详细消息,请使用.\Do-It.ps1 -Verbose

进行调用
[CmdletBinding()]
Param(
    [Parameter(Mandatory=$true, position=0)]
    [string]$computername

    ,[Parameter(Mandatory=$true, position=1)]
    [string[]]$sharenames

    ,[Parameter(Mandatory=$false, position=2)]
    [string]$dest = 'E:/back_fold/asuscloud'
)

$excludeshares = @('SHARE1', 'OTHERSHARE')

foreach ($sharename in $sharenames) {
    write-Verbose $sharename
    if ($excludeshares -notcontains $sharename.ToUpper()) {
        $Path = "//$computername/$sharename"
        $cmdline = { robocopy $Path $Dest /B /MT:64 /IS /Z /FP /MIR /TEE /NP /FP /NDL }
        Write-Verbose $cmdline.ToString()
        & $cmdline
    }
}

这可以与包含SHARENAME列表的文件一起使用。

.\Do-It.ps1 -computername '192.168.1.100' -sharenames $(Get-Content -Path .\sharelist.txt)

答案 1 :(得分:0)

记住\是转义字符。二\等于1。尝试在变量字符串上使用单引号'而不是双引号"

这就是为什么它要查找\ 192.168.1.100 \而不是\ 192.168.1.100 \

如果需要,我还将提供共享名。

单引号将使您不需要转义。示例:

$Path = Split-Path '\\192.168.1.100\asuscloud\*'
$Dest = 'E:\back_fold\asuscloud\'

使用双引号可能需要转义。示例:

$Path = Split-Path "\\\\192.168.1.100\\asuscloud\\*"
$Dest = "E:\\back_fold\\asuscloud\\"

请注意,您可能还需要转义星号。

包括共享名(如果需要)。示例:

$Path = Split-Path '\\192.168.1.100\c$\asuscloud\*'