Траверс самбы делится во время робокопии и исключает некоторые - PullRequest
0 голосов
/ 01 сентября 2018

Я использую 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 switch

$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

Начало работы: суббота, 1 сентября 2018 г., 20: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 голосов
/ 03 сентября 2018

Это не приводит к динамическому поиску общих папок на удаленном хосте, но позволяет указать 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)
0 голосов
/ 02 сентября 2018

помните \ - это escape-символ. Два \ равно 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\\"

Пожалуйста, обратите внимание, что вам может понадобиться и звездочка.

Включая sharename (при необходимости). Пример:

$Path = Split-Path '\\192.168.1.100\c$\asuscloud\*'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...