使用PowerShell 2.0复制/传输文件

时间:2013-07-08 15:28:00

标签: powershell

我正在尝试创建一个PowerShell脚本,使用其IP地址将文件从本地计算机复制到远程计算机。

我使用此命令测试了我的客户端 - 服务器连接:

Invoke Command -ComputerName <IP Address> -ScriptBlock {ipconfig} -Credential $credential

(在此命令之前输入$ credential)。

我尝试使用Copy-ItemRobocopy命令,但我不清楚它是否会获取我的凭据,然后让我将文件从本地复制到远程计算机。具体来说,这些甚至是否支持本地到远程文件传输

很多时候我遇到过以下错误: 用户名和密码错误,源路径不存在或目标路径不存在。但我仍然想确定我是否在正确的轨道上并使用正确的命令来实现我想要的东西,或者是否还有其他我应该考虑使用的东西。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:7)

看起来您正在尝试使用PowerShell远程复制来复制文件。正如在其他答案中发布的那样,使用Copy-Item和/或Robocopy从源复制到目标计算机上的共享会更简单。

如果要使用PowerShell远程处理复制文件,可以将文件粘贴到变量中并在远程脚本块中使用它。类似的东西:

$contents = [IO.File]::ReadAllBytes( $localPath )
Invoke-Command -ComputerName <IP Address> `
               -Credential $credential  `
               -ScriptBlock { [IO.File]::WriteAllBytes( 'C:\remotepath', $using:contents ) }

当然,如果您正在阅读的文件非常大,这可能会导致远程连接内存不足(默认情况下,PowerShell将远程连接限制为大约128MB)。

如果你使用PowerShell 2,你需要将字节作为脚本块参数传递:

$contents = [IO.File]::ReadAllBytes( $localPath )
Invoke-Command -ComputerName <IP Address> `
               -Credential $credential  `
               -ScriptBlock { 
                   param(
                       [byte[]]
                       $Contents
                   )
                   [IO.File]::WriteAllBytes( 'C:\remotepath', $Contents) 
               } `
               -ArgumentList @( ,$contents )

是的,在将$contents作为-ArgumentList参数的值传递时,必须将,包装在数组中,并且必须以逗号运算符{{1为前缀否则你的远程脚本块只会收到第一个字节。

答案 1 :(得分:6)

PowerShell的一个好处是(与DOS不同)它支持UNC路径。所以你可以在文学上做:

Copy-Item -Path <local file path> -Destination \\<server IP>\<share>\<path>

当然,您的帐户需要有权访问该位置。如果您需要输入备用凭据,可以使用net use \\<server IP>\<share> /user:[<domain>\]<user> <password>

进行预身份验证