【问题标题】:Copy/transfer file using PowerShell 2.0使用 PowerShell 2.0 复制/传输文件
【发布时间】:2013-07-08 15:28:00
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 您需要发布实际代码和遇到的错误。不要含糊其辞。您已经尝试了一些东西,但它不起作用 - 向我们展示您尝试了什么以及失败的原因。
  • Powershell 以您已有的权限运行命令。因此,如果您能够通过 gui 进行复制,那么 Copy-Item 应该可以工作。
  • 建议:映射一个网络驱动器,如果需要,可以使用旧的net use 命令。如需更多高级功能,请查看 start-bitstransfer 或 robocopy
  • @Kayasax 你也可以使用New-PSDrive 代替net use
  • 感谢大家为我提供如此大的帮助。 @alroc 我没有发布我的脚本,因为我仍在点击并尝试执行 copy-item using credentials 的命令,这将帮助我登录机器,然后我才能推送文件。我将获取有关 New-PSDrive 的帮助并尝试实施。

标签: powershell


【解决方案1】:

您似乎正在尝试使用 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 参数时将其包装在一个数组中并且它必须以逗号运算符, 为前缀,否则您的遥控器脚本块只会接收第一个字节。

【讨论】:

  • 谢谢!我试过了,但它给了我这个错误“无法检索使用变量............并且只有在远程计算机上调用 ScriptBlock 时它才有效”。然而,我确实定义了 $localPath 和 $contents。
  • 您使用的是 PowerShell 2,而不是 PowerShell 3。请查看 $PSVersionTable 的值确认。
  • 哦,是的,感谢您让我注意到这个愚蠢的错误。我错过了这一点,因为我所有的远程机器都是 3.0 版,我认为这也是如此。但这会导致很多差异吗?
  • 是的。我更新了我的答案以显示您在 PowerShell 2 中必须执行的操作。我感觉到您的未来会升级。 :-)
  • 运行上述脚本时出现此错误。 使用“1”参数调用“ReadAllBytes”的异常:“空路径名不合法。”
【解决方案2】:

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

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

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

【讨论】:

  • 与问题无关,但 DOS 确实支持 UNC 路径,只是不能将当前目录 (cd) 更改为 UNC 目录。
  • 也不相关,但 DOS 几乎在十年前就被淘汰了。命令提示符!= DOS。
  • @BACON 你可以!试试pushd \\server\share
  • @Kayasax 在 UNC 路径上运行 pushd 时,当前目录将更改为映射驱动器,而不是指定的 UNC 路径。它基本上是为您在幕后运行net use
  • @alroc 我试图通过提及 DOS 来消除 PowerShell 和命令提示符之间的歧义。很多人将它与命令提示符同义(你知道我在说什么:)。由于其名称不明确,命令提示符可能会与 PowerShell 混淆。也许从现在开始我们应该把它称为 WeakShell :)
猜你喜欢
  • 1970-01-01
  • 2021-11-27
  • 1970-01-01
  • 1970-01-01
  • 2019-11-03
  • 2014-07-08
  • 1970-01-01
  • 2012-05-31
相关资源
最近更新 更多