6

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

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

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

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

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

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

4

2 回答 2

7

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

如果要使用 PowerShell 远程复制文件,可以将文件 slurp 到变量中并在远程脚本块中使用它。就像是:

$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,

于 2013-07-09T07:19:10.030 回答
6

PowerShell 的优点之一是(与 DOS 不同)它支持 UNC 路径。所以你可以文学只是这样做:

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

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

于 2013-07-08T16:38:15.610 回答