Назад | Перейти на главную страницу

Передача файлов через Powershell Remoting (например, scp в Linux)

Во время создания нескольких сценариев развертывания на основе PowerShell я очень упустил простой способ быстро передать файл на другой сервер (через Интернет) с помощью Powershell Remoting, что-то вроде scp для Linux. К счастью, кое-что, что можно активировать через Powershell Remoting. Я что-то упустил?

Вы можете легко скопировать содержимое файла по сети через сеанс PSRemoting, используя Invoke-Command и Set-Content:

$Session = New-PSSession -ComputerName "remotehost.domain.tld" -Credential (Get-Credential) -UseSsl

$FileContents = Get-Content -Path 'C:\path\to\arbitrary.file'
Invoke-Command -Session $Session -ScriptBlock {
    param($FilePath,$data)
    Set-Content -Path $FilePath -Value $data
} -ArgumentList "C:\remote\file\path.file",$FileContents

Новое в PowerShell 5.0: Copy-Item теперь идет с -ToSession и -FromSession параметры!

Подробнее и примеры здесь: Копировать в или из сеанса PowerShell

Один лайнер для вас. Работает на любой версии. Переносит двоичные файлы, если хотите.

Чтобы поместить файл:

Invoke-Command -ComputerName "myserver.somewhere.net" -Credential (Get-Credential) -ScriptBlock {[io.file]::WriteAllBytes($Args[0],$Args[1])} -ArgumentList "c:\remote.file.path",(get-content "c:\local.file.path" -encoding byte -Read 0)

Чтобы получить файл (переменные не удаляются):

[io.file]::WriteAllBytes("$localfile",(Invoke-Command -ComputerName $remotehost -Credential $usercred -ScriptBlock {get-content $Args[0] -encoding byte -Read 0} -ArgumentList "$remotefile"))