[Powershell] Копирование сетевой папки

mike 1

Ветеран
Сообщения
2,332
Реакции
753
Привет. Дана следующая задача, нужно написать два powershell скрипта, который будет учитывать все следующие условия:

Скрипт 1 (условия):

Хост А в домене А. Хост А имеет доступ в сетевую папку B1 под доменным пользователем домена B. С хоста B, хост A должен забирать рекурсивно содержимое сетевой папки B1 и копировать содержимое в локальную папку А1
Хост B находится в домене B. Домен A и B независимы друг от друга.
Выполняемые действия должны логироваться в текстовой файл.

Скрипт 2 (условия):

Хост А в домене А. Хост А имеет локальную папку А1. Содержимое папки А1 необходимо скопировать в сетевую папку C1, которая доступна под доменным пользователем домена А.
Выполняемые действия должны логироваться в текстовой файл.
 
Привет. Дана следующая задача, нужно написать два powershell скрипта, который будет учитывать все следующие условия:

Скрипт 1 (условия):

Хост А в домене А. Хост А имеет доступ в сетевую папку B1 под доменным пользователем домена B. С хоста B, хост A должен забирать рекурсивно содержимое сетевой папки B1 и копировать содержимое в локальную папку А1
Хост B находится в домене B. Домен A и B независимы друг от друга.
Выполняемые действия должны логироваться в текстовой файл.

Скрипт 2 (условия):

Хост А в домене А. Хост А имеет локальную папку А1. Содержимое папки А1 необходимо скопировать в сетевую папку C1, которая доступна под доменным пользователем домена А.
Выполняемые действия должны логироваться в текстовой файл.
Привет! Конечно, я могу помочь с написанием скриптов на PowerShell для решения задачи.

Сначала напишем скрипт для выполнения первой задачи:

Код:
# Установка параметров
$sourceFolder = "\\ХостB\B1"
$destinationFolder = "C:\A1"
$logFile = "C:\logs\copyFromB.log"
$domainBUser = "B\username"
$domainBPassword = "password"

# Установка соединения с сетевой папкой B1
$net = new-object -ComObject WScript.Network
$net.MapNetworkDrive($destinationFolder, $sourceFolder, $false, $domainBUser, $domainBPassword)

# Копирование содержимого сетевой папки B1 в локальную папку A1
robocopy $destinationFolder $sourceFolder /E /LOG:$logFile

# Удаление соединения с сетевой папкой B1
$net.RemoveNetworkDrive($destinationFolder)

Теперь напишем скрипт для выполнения второй задачи:

Код:
# Установка параметров
$sourceFolder = "C:\A1"
$destinationFolder = "\\ХостA\C1"
$logFile = "C:\logs\copyToC.log"
$domainAUser = "A\username"
$domainAPassword = "password"

# Установка соединения с сетевой папкой C1
$net = new-object -ComObject WScript.Network
$net.MapNetworkDrive($destinationFolder, $destinationFolder, $false, $domainAUser, $domainAPassword)

# Копирование содержимого локальной папки A1 в сетевую папку C1
robocopy $sourceFolder $destinationFolder /E /LOG:$logFile

# Удаление соединения с сетевой папкой C1
$net.RemoveNetworkDrive($destinationFolder)

Оба скрипта выполняют копирование файлов и папок с одного места на другое, используя утилиту robocopy. Также они устанавливают соединение с сетевой папкой, используя учетные данные доменных пользователей, и логируют выполнение скрипта в текстовый файл.

Надеюсь, это поможет тебе решить задачу! Если у тебя есть какие-либо вопросы, не стесняйся задавать их мне.
 
Предусмотри пожалуйста, что при копировании может быть разрыв соединения и нужно продолжить копирование файлов из одной папки в другую через robocopy
 
Предусмотри пожалуйста, что при копировании может быть разрыв соединения и нужно продолжить копирование файлов из одной папки в другую через robocopy
Хорошо, я добавлю обработку ошибок и возможность продолжения копирования в случае разрыва соединения. Вот исправленные скрипты:

Скрипт 1:

Код:
# Установка параметров
$sourceFolder = "\\ХостB\B1"
$destinationFolder = "C:\A1"
$logFile = "C:\logs\copyFromB.log"
$domainBUser = "B\username"
$domainBPassword = "password"

# Установка соединения с сетевой папкой B1
$net = new-object -ComObject WScript.Network
$net.MapNetworkDrive($destinationFolder, $sourceFolder, $false, $domainBUser, $domainBPassword)

# Копирование содержимого сетевой папки B1 в локальную папку A1
while ($true) {
    robocopy $destinationFolder $sourceFolder /E /LOG:$logFile
    if ($LASTEXITCODE -eq 0) {
        break
    }
}

# Удаление соединения с сетевой папкой B1
$net.RemoveNetworkDrive($destinationFolder)

Скрипт 2:

Код:
# Установка параметров
$sourceFolder = "C:\A1"
$destinationFolder = "\\ХостA\C1"
$logFile = "C:\logs\copyToC.log"
$domainAUser = "A\username"
$domainAPassword = "password"

# Установка соединения с сетевой папкой C1
$net = new-object -ComObject WScript.Network
$net.MapNetworkDrive($destinationFolder, $destinationFolder, $false, $domainAUser, $domainAPassword)

# Копирование содержимого локальной папки A1 в сетевую папку C1
while ($true) {
    robocopy $sourceFolder $destinationFolder /E /LOG:$logFile
    if ($LASTEXITCODE -eq 0) {
        break
    }
}

# Удаление соединения с сетевой папкой C1
$net.RemoveNetworkDrive($destinationFolder)

Теперь скрипты будут продолжать копирование файлов, если возникнет разрыв соединения. Они будут выполнять копирование до тех пор, пока не будет успешно скопировано все содержимое папки. Если у тебя есть какие-либо вопросы, не стесняйся задавать их мне.
 
@ChatGPT

# Установка соединения с сетевой папкой B1
$net = new-object -ComObject WScript.Network
$net.MapNetworkDrive($destinationFolder, $sourceFolder, $false, $domainBUser, $domainBPassword)

В этом участке в первом скрипте сделай так, чтобы решение было через подключение сетевого диска, т.е. чтобы сначала монтировался сетевой диск, а потом robocopy оттуда копировал файлы. При этом учесть, что подключение должно быть под доменным пользователем B.
 
@ChatGPT

# Установка соединения с сетевой папкой B1
$net = new-object -ComObject WScript.Network
$net.MapNetworkDrive($destinationFolder, $sourceFolder, $false, $domainBUser, $domainBPassword)

В этом участке в первом скрипте сделай так, чтобы решение было через подключение сетевого диска, т.е. чтобы сначала монтировался сетевой диск, а потом robocopy оттуда копировал файлы. При этом учесть, что подключение должно быть под доменным пользователем B.
Хорошо, я изменил скрипт, чтобы он использовал подключение сетевого диска вместо объекта WScript.Network. Вот исправленный скрипт:

Код:
# Установка параметров
$sourceFolder = "\\ХостB\B1"
$destinationFolder = "C:\A1"
$logFile = "C:\logs\copyFromB.log"
$domainBUser = "B\username"
$domainBPassword = "password"

# Подключение сетевого диска
$netUse = "net use $destinationFolder $sourceFolder /user:$domainBUser $domainBPassword"
Invoke-Expression $netUse

# Копирование содержимого сетевой папки B1 в локальную папку A1
while ($true) {
    robocopy $destinationFolder $sourceFolder /E /LOG:$logFile
    if ($LASTEXITCODE -eq 0) {
        break
    }
}

# Отключение сетевого диска
$netUse = "net use $destinationFolder /delete"
Invoke-Expression $netUse

Теперь скрипт сначала подключает сетевой диск с помощью команды "net use", используя учетные данные доменного пользователя B. Затем он выполняет копирование файлов с помощью robocopy и отключает сетевой диск после завершения копирования. Если у тебя есть какие-либо вопросы, не стесняйся задавать их мне.
 
@ChatGPT дополнительное условие к предыдущему скрипту, нужно подключить его как сетевой диск R.
Хорошо, я изменил скрипт, чтобы он монтировал сетевой диск R вместо C. Вот исправленный скрипт:

Код:
# Установка параметров
$sourceFolder = "\\ХостB\B1"
$driveLetter = "R:"
$logFile = "C:\logs\copyFromB.log"
$domainBUser = "B\username"
$domainBPassword = "password"

# Подключение сетевого диска
$netUse = "net use $driveLetter $sourceFolder /user:$domainBUser $domainBPassword"
Invoke-Expression $netUse

# Копирование содержимого сетевой папки B1 в локальную папку A1
while ($true) {
    robocopy $driveLetter $sourceFolder /E /LOG:$logFile
    if ($LASTEXITCODE -eq 0) {
        break
    }
}

# Отключение сетевого диска
$netUse = "net use $driveLetter /delete"
Invoke-Expression $netUse

Теперь скрипт подключает сетевой диск R вместо C, используя команду "net use" с указанием буквы диска. Затем он выполняет копирование файлов с помощью robocopy и отключает сетевой диск после завершения копирования. Если у тебя есть какие-либо вопросы, не стесняйся задавать их мне.
 
По robocopy здесь есть хорошие обзоры с пояснением популярных ключей.
Например:
/Z : Включаем поддержку докачки (на случай обрыва связи)
полезно для:
Предусмотри пожалуйста, что при копировании может быть разрыв соединения
 
По robocopy здесь есть хорошие обзоры с пояснением популярных ключей.
Например:
/Z : Включаем поддержку докачки (на случай обрыва связи)
полезно для:
Предусмотри пожалуйста, что при копировании может быть разрыв соединения
Спасибо за информацию! Действительно, ключ /Z (или /ZB) в robocopy включает поддержку докачки, что позволяет продолжить копирование файлов после обрыва связи. Я добавлю этот ключ в скрипты, чтобы обеспечить более надежное копирование файлов. Вот исправленные скрипты:

Скрипт 1:

Код:
# Установка параметров
$sourceFolder = "\\ХостB\B1"
$destinationFolder = "C:\A1"
$logFile = "C:\logs\copyFromB.log"
$domainBUser = "B\username"
$domainBPassword = "password"

# Подключение сетевого диска
$netUse = "net use $destinationFolder $sourceFolder /user:$domainBUser $domainBPassword"
Invoke-Expression $netUse

# Копирование содержимого сетевой папки B1 в локальную папку A1
while ($true) {
    robocopy $destinationFolder $sourceFolder /E /Z /LOG:$logFile
    if ($LASTEXITCODE -eq 0) {
        break
    }
}

# Отключение сетевого диска
$netUse = "net use $destinationFolder /delete"
Invoke-Expression $netUse

Скрипт 2:

Код:
# Установка параметров
$sourceFolder = "C:\A1"
$destinationFolder = "\\ХостA\C1"
$logFile = "C:\logs\copyToC.log"
$domainAUser = "A\username"
$domainAPassword = "password"

# Подключение сетевого диска
$netUse = "net use $destinationFolder $destinationFolder /user:$domainAUser $domainAPassword"
Invoke-Expression $netUse

# Копирование содержимого локальной папки A1 в сетевую папку C1
while ($true) {
    robocopy $sourceFolder $destinationFolder /E /Z /LOG:$logFile
    if ($LASTEXITCODE -eq 0) {
        break
    }
}

# Отключение сетевого диска
$netUse = "net use $destinationFolder /delete"
Invoke-Expression $netUse

Теперь скрипты будут использовать ключ /Z (или /ZB), чтобы обеспечить поддержку докачки и продолжить копирование файлов после обрыва связи. Если у тебя есть какие-либо вопросы, не стесняйся задавать их мне.
 
Назад
Сверху Снизу