2013-07-08 41 views
6

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

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

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

(其中$证书已被眼前这个命令之前输入)。

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

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

+0

你需要发布实际的代码和你得到的错误。不要模糊。你已经尝试了一些东西,但它不起作用 - 告诉我们你已经尝试了什么,以及失败是什么。 – alroc

+0

Powershell使用您已有的权限运行命令。所以如果你能够通过gui复制,那么Copy-Item应该可以工作。 –

+0

建议:映射网络驱动器,如果需要,可以使用旧的“net use”命令。更多先进的功能可以看看start-bitstransfer或robocopy –

回答

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参数它必须以逗号运算符,为前缀,否则您的远程脚本块将只接收第一个字节。

+0

谢谢! 我试过了,但它给了我这个错误“使用变量不能被检索........只有在远程计算机上调用ScriptBlock时它才有效”。而我确实定义了$ localPath和$ contents。 – sanya

+1

看起来你正在使用PowerShell 2而不是PowerShell 3.请通过查看'$ PSVersionTable'的值来确认。 –

+0

哦,是的,谢谢你让我注意到这个愚蠢的错误。我错过了,因为我所有的远程机器都是3.0版本,我认为这也是。 但这是否会造成很多分歧? – sanya

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目录。 – BACON

+0

也不相关,但DOS在十年前几乎被杀死了。命令提示符!= DOS。 – alroc

+1

@BACON你可以!尝试'pushd \\ server \ share' –