在远程计算机上复制文件的PowerShell命令

12

我需要使用PowerShell将文件从本地计算机复制到远程计算机,可以使用以下命令将文件复制到远程计算机:

copy-item -Path d:\Shared\test.txt -Destination \\server1\Shared

上述命令使用网络共享路径来复制文件。我不想使用网络共享选项,因为在远程计算机上该文件夹不会被共享。我尝试了以下命令,但无法正常工作。

copy-item -Path d:\Shared\test.txt -Destination \\server1\c$\Shared

Invoke-Command -ComputerName \\server -ScriptBlock {
  copy-item -Path D:\Shared\test.txt -Destination C:\Shared
}
请告诉我如何使其正常工作,而不使用UNC路径。我在远程机器上有该文件夹的完全权限。

请告诉我如何使其正常工作,而不使用UNC路径。我在远程机器上有该文件夹的完全权限。


2
“不工作”到底是什么意思?你收到了错误消息吗?根本没有复制文件吗?文件被复制到错误的位置了吗?错误的文件被复制到正确的位置了吗?还是发生了其他事情? - vonPryz
2
运行 Invoke 命令时,路径将相对于正在运行的服务器,因此 D:\Shared\test.txt 需要是 UNC 路径。 - Matt
我遇到了“网络路径未找到”的错误。 - Parveen Kumar
1
可能是使用Powershell远程复制文件的重复问题。 - bummi
6个回答

8

我发现最快的方法,因为使用的帐户是管理员,是执行以下操作:

New-PSDrive -Name X -PSProvider FileSystem -Root \\MyRemoteServer\c$\My\Folder\Somewhere\
cd X:\
cp ~\Desktop\MyFile.txt .\
## Important, need to exit out of X:\ for unmouting share
cd c:\
Remove-PSDrive X

每次都能正常工作。

2
你可以考虑使用 Push-LocationPop-Location 命令用于进入和退出 X:\ 目录。这样代码执行后将不会更改当前目录,使得在函数或类似范围内使用更加简单。 - jpmc26
这对我仍然没有用。虽然它让我完成了一半。PS 5.1。在复制后,我不得不在源文件夹和目标文件夹上使用Get-ChildItem。否则,Copy-Item会很快完成,但文件不会被复制。 - user208145

4

您需要拥有共享文件夹才能够在主机之间复制文件,无论是在远程主机上还是本地主机上(如果想要推送文件):

Copy-Item -Path D:\folder\test.txt -Destination \\server1\remoteshare\

如果您想拉取文件,则可以在本地主机上执行此操作:

Invoke-Command -ComputerName server1 -ScriptBlock {
  Copy-Item -Path \\localcomputer\localshare\test.txt -Destination C:\Shared\
}

只有在您的账户拥有特定计算机的管理员权限时,才能使用管理共享 (\\server1\c$)。


我在远程机器上拥有管理员权限,但 \server1\c$ 无法工作。错误提示为“网络路径未找到”。 - Parveen Kumar
2
@ParveenKumar 服务器1上的Windows防火墙是否允许SMB连接?您能否telnet到服务器1上的445端口? - Ansgar Wiechers

4

如果没有可访问的共享文件夹,您必须将文件内容本身作为脚本的参数:

Invoke-Command -ComputerName \\server -ScriptBlock {
  $args[0] | Set-Content  C:\Shared\test.txt
  } -ArgumentList (Get-Content D:\Shared\test.txt -Raw) 

2
对于文本文件,仅使用-RawGet-Content是可以的。对于二进制文件,请使用-Encoding Byte -ReadCount 0 -Raw。或者使用ReadAllBytes/WriteAllBytes - Edward Brey

3

PowerShell 5 (Windows Server 2016)

此外,也可下载用于早期版本的Windows系统。可以使用-ToSession参数。

$b = New-PSSession B
Copy-Item -FromSession $b C:\Programs\temp\test.txt -Destination C:\Programs\temp\test.txt

早期版本的PowerShell

不需要任何特殊操作,这些隐藏的共享资源在所有机器上都存在。

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

1
这对我很有效。不想使用net use或连接驱动器,这个方法完美无缺。 - Jlisk

1
Invoke-Command -ComputerName compname -Credential $cred  -ScriptBlock { Get-Content C:\myfolder\result.txt } >>res.txt

请注意,C:\myfolder\result.txt 文件位于远程计算机上。

0

这是一个适用于小文件的脚本,以管理员身份运行。

#pre 5.0 powershell copy-item to remote computer
Write-Host "Remote copy a file"
$servers = @("server01.dot.com", "server02.dot.com")
foreach($server in $servers) {
$username = 'USERNAME'
$password = 'PASSWORD'
$pw   = ConvertTo-SecureString $password -AsPlainText -Force
$cred = New-Object Management.Automation.PSCredential ($username, $pw)
$myfile = [System.IO.File]::ReadAllBytes("C:\Temp\srctest.txt")
$s = New-PSSession -computerName $server -credential $cred
Enter-PSSession $s
Invoke-Command -Session $s -ArgumentList $myfile -Scriptblock {[System.IO.File]::WriteAllBytes("C:\Temp\desttest.txt", $args)}   
Write-Host "Completed"
Remove-PSSession $s
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接