Удаленное копирование файла с помощью Powershell

Я пишуpowershell скрипт, который я хочу запустить с сервера А. Я хочу подключиться к серверу B и скопировать файл на сервер A в качестве резервной копии.

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

Я вижу ониCopy-Item команда, но я не вижу, как дать ему имя компьютера.

Я бы подумал, что мог бы сделать что-то вроде

Copy-Item -ComputerName ServerB -Path C:\Programs\temp\test.txt -Destination (not sure how it would know to use ServerB or ServerA)

Как я могу это сделать?

 Shawn Melton24 мая 2012 г., 19:34
Чтобы использовать Copy-Item, вам необходимо использовать UNC-путь, например & quot; \\ ServerB \ C $ \ Programs \ temp \ test.txt & quot;

Ответы на вопрос(5)

net use или жеNew-PSDrive создать новый диск.

New-PsDrive : создайте новый PsDrive, видимый только в среде powershell:

New-PSDrive -Name Y -PSProvider filesystem -Root \\ServerName\Share
Copy-Item BigFile Y:\BigFileCopy

Net use : создайте новый диск, видимый во всех частях ОС.

Net use y: \\ServerName\Share
Copy-Item BigFile Y:\BigFileCopy
 17 сент. 2018 г., 16:08
Нет смысла бегатьNew-PSDrive два раза вы должны иметьA drive with the name 'Y' already exists.
 18 сент. 2018 г., 15:55
Как насчет тестирования, если он смонтирован перед установкой? или вы можете использовать Remove-PSDrive в своем скрипте, когда вы уверены, что все дескрипторы, использующие этот путь, закрыты.
 18 сент. 2018 г., 13:52
Я согласен, что нет смысла запускать его дважды. Но он включен в этап сборки, и сборка выполняется несколько раз в день. Поэтому мой подход состоял в том, чтобы удалить диск после того, как я выполнил нужную работу, и я предполагал, что без проблем будет воссоздать его, когда произойдет новое выполнение сборки. Но это кажется проблемой, хотя. Любой другой намек?
 17 сент. 2018 г., 14:43
Если я запускаю это дважды, я получаюNew-PSDrive : A specified logon session does not exist. It may already have been terminated - & GT; Я думаю, что предыдущая сессия все еще продолжается - & gt; Поэтому я попытался использоватьRemove-PSDrive - & GT; Тем не менее, это не работает. Такжеnet use <driveLetter> /delete не помогло. Любая другая вещь, которую я могу сделать, чтобы я мог выполнить эту команду в конфигурации сборки программного обеспечения?
Решение Вопроса

It's much easier this way.

Copy-Item -Path \\serverb\c$\programs\temp\test.txt -Destination \\servera\c$\programs\temp\test.txt;

By using UNC paths instead of local filesystem paths, you help to ensure that your script is executable from any client system with access to those UNC paths. If you use local filesystem paths, then you are cornering yourself into running the script on a specific computer.

Это работает только тогда, когда сеанс PowerShell выполняется под пользователем, который имеет права на оба административных ресурса. Я предлагаю использовать обычный сетевой ресурс на сервере B с доступом только для чтения всем и просто позвонить (с сервера A):

Copy-Item -Path "\\\ServerB\SharedPathToSourceFile" -Destination "$Env:USERPROFILE" -Force -PassThru -Verbose
 06 мая 2014 г., 19:08
Или вы могли бы использоватьInvoke-Command.
 27 февр. 2018 г., 14:00
Это решение работает только при отсутствии межсетевого экрана между узлами, блокирующими общие ресурсы UNC. В этом случае правильное решение ниже (Copy-Item -FromSession).
 06 мая 2014 г., 15:49
Одна возможная проблема с этим подходом состоит в том, что Copy-Item не поддерживает альтернативные учетные данные (если вам нужно выполнить команду с другим пользователем). В этом случае требуется подход New-PSDrive.

PowerShell version 5 onwards (включен в Windows Server 2016,скачивается как часть WMF 5 для более ранних версий), это возможно с удаленного взаимодействия. Преимущество этого состоит в том, что он работает, даже если по какой-либо причине вы не можете получить доступ к общим ресурсам.

Чтобы это работало, в локальном сеансе, где начинается копирование, должен быть установлен PowerShell 5 или выше. Удаленный сеанс делаетnot необходимо установить PowerShell 5 - он работает с версиями PowerShell от 2 и версиями Windows Server от 2008 R2.[1]

С сервера A создайте сеанс на сервере B:

$b = New-PSSession B

А потом еще из А:

Copy-Item -FromSession $b C:\Programs\temp\test.txt -Destination C:\Programs\temp\test.txt

Копирование элементов в B выполняется с помощью-ToSession, Обратите внимание, что локальные пути используются в обоих случаях; Вы должны следить за тем, на каком сервере вы находитесь.

[1]: при копировании с или на удаленный сервер, на котором установлен только PowerShell 2, остерегайтесьэта ошибка в PowerShell 5.1что на момент написания означает, что рекурсивное копирование файлов не работает с-ToSessionочевидно, что копирование вообще не работает с-FromSession.

 05 окт. 2016 г., 20:06
Если вы используете -ToSession для источника, PS 5 должен быть установлен только для источника. Если вы используете -FromSession для цели, только для цели необходим PS 5.
 26 окт. 2016 г., 03:11
Это также работает, когда у вас установлен только гипервизор (без сервера), не нужно настраивать общие ресурсы, просто используйте сеансы!
 08 июн. 2017 г., 00:05
Спасибо! Хорошее, элегантное решение, похожее наscp надssh на линуксе ... не надо заморачиваться с надоедливыми акциями!
 05 окт. 2016 г., 19:55
Я обнаружил, что на обоих серверах не обязательно устанавливать PS 5. Я только что провел успешный тест, где только на исходном сервере (Windows 10) была установлена PS 5. Целью была Windows Server 2012 R2 с установленным PS по умолчанию ($ PSVersionTable.PSVersion reports 4).

None из вышеперечисленных ответов работал для меня. Получил эту ошибку:

+ CategoryInfo          : PermissionDenied: (\\192.168.1.100\Shared\test.txt:String) [Copy-Item], UnauthorizedAccessException>   
+ FullyQualifiedErrorId : ItemExistsUnauthorizedAccessError,Microsoft.PowerShell.Commands.CopyItemCommand

Такthis сделал это для меня:

netsh advfirewall firewall set rule group="File and Printer Sharing" new enable=yes

Затем с моего хоста моя машина в окне «Выполнить» просто делает это \ {ip of nanoserver} \ C $

 11 дек. 2017 г., 06:24
у меня это не сработало, но все равно получаю ошибку
 31 мая 2016 г., 20:36
Скорее всего, у вас возникли проблемы с разрешениями для файловой системы share +. Помните, что самые ограничивающие разрешения выигрывают, поэтому даже если у вас есть доступ на уровне файловой системы NTFS, если общие права доступа ограничивают вас, вы не сможете писать. :)

если для доступа к удаленному файлу нужны ваши учетные данные, вы можете сгенерироватьSystem.Net.WebClient объект с помощью командлетаNew-Object на & quot; Копировать файл удаленно & quot ;, вот так

$Source = "\\192.168.x.x\somefile.txt"
$Dest   = "C:\Users\user\somefile.txt"
$Username = "username"
$Password = "password"

$WebClient = New-Object System.Net.WebClient
$WebClient.Credentials = New-Object System.Net.NetworkCredential($Username, $Password)

$WebClient.DownloadFile($Source, $Dest)

Или, если вам нужно загрузить файл, вы можете использовать UploadFile

$Dest = "\\192.168.x.x\somefile.txt"
$Source   = "C:\Users\user\somefile.txt"

$WebClient.UploadFile($Dest, $Source)
 29 июл. 2016 г., 13:03
взлом обнаружен :)
 08 дек. 2016 г., 16:46
@klm_ Не могли бы вы объяснить, что вы имеете в виду?

Ваш ответ на вопрос