使用PowerShell 2.0复制/传输文件

6

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

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

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

在此命令之前,已经输入了$credential。

我尝试使用Copy-ItemRobocopy命令,但我不确定它是否会使用我的凭据,并允许我从本地复制文件到远程计算机。具体来说,这些命令是否支持本地到远程文件传输

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


你需要发布实际的代码和错误信息。不要含糊其辞。你已经尝试了一些东西,但它没有起作用 - 展示给我们你尝试过什么以及失败的原因。 - alroc
PowerShell使用您已经拥有的任何权限来运行命令。因此,如果您能够通过GUI复制,则Copy-Item应该可以工作。 - Kevin_
建议:如果您想映射网络驱动器,可以使用旧的“net use”命令。要获取更高级的功能,请查看start-bitstransfer或robocopy。 - Loïc MICHEL
1
@Kayasax,你也可以使用New-PSDrive代替net use - alroc
谢谢大家提供给我这么好的帮助。 @alroc 我还没有发布我的脚本,因为我仍在尝试使用凭据执行copy-item命令,这将帮助我登录到机器上,然后我才能推送文件。 我将获取有关New-PSDrive的帮助,并尝试实施它。 - sanya
2个回答

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参数时,您必须将其包装在数组中,并且必须使用逗号运算符,作为前缀,否则您的远程脚本块只会接收到第一个字节。


我尝试了一下,但是它给了我这个错误:“无法检索Using变量......只有在远程计算机上调用ScriptBlock时才有效”。然而,我确实定义了$localPath和$contents。 - sanya
1
看起来你正在使用 PowerShell 2 而非 PowerShell 3。请通过查看 $PSVersionTable 的值进行确认。 - Aaron Jensen
哦,是的,谢谢你让我注意到这个愚蠢的错误。由于我所有的远程机器都是3.0版本,所以我假设这个也是。 但是,这会造成很多不同吗? - sanya
是的,我确实这样做了。 我设置了**$localPath = 'C:\folderName\fileName'**但现在当我运行它时,没有任何输出或错误。 - sanya
只需对'C:\remotepath'进行微小更改,我就可以将其复制到远程机器上。谢谢。 但我仍然会尝试通过UNC路径发送。了解两种创建脚本的方法会很有帮助。 - sanya
显示剩余4条评论

6

PowerShell的一大优点(与DOS不同)是它支持UNC路径。因此,您只需执行以下操作:

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

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


1
与问题无关,但DOS确实支持UNC路径,只是您不能将当前目录(cd)更改为UNC目录。 - Lance U. Matthews
1
@BACON 你可以的!尝试使用 pushd \\server\share - Loïc MICHEL
1
当你在UNC路径上运行pushd时,当前目录会更改为映射驱动器,而非指定的UNC路径。实际上,它在后台为您运行了net use操作。 - Lance U. Matthews
1
@alroc 我试图通过提到DOS来消除PowerShell和命令提示符之间的歧义。很多人将其视为命令提示符的同义词(你知道我在说什么:)。由于其名称不明确,命令提示符可能会与PowerShell混淆。也许我们现在应该称其为WeakShell :) - Andy Arismendi
我尝试从本地机器运行此命令,但遇到了问题。因此,我通过 Test-Path -path \<RemoteServerIP>\folder 测试了目标路径,但它返回 false,而我可以看到它确实存在。所以我知道这个文件夹存在,但无法远程检查它。 - sanya
显示剩余3条评论

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