需要在 Powershell 中从网络驱动器复制项目,求助。

21

我正在尝试使用以下命令将位于远程机器上的文件通过Copy-Item命令复制到另一台远程机器上:

Copy-Item -Path "\\machine1\abc\123\log 1.zip" -Destination "\\machine2\\c$\Logs\"

我不断地遇到错误 "无法找到路径“\\machine1\abc\123\log 1.zip”"

我可以手动访问该路径并从那里复制。

我以管理员身份打开PowerCLI并运行此脚本... 我完全卡在这里,不确定如何解决。


1
如果你运行 Get-ChildItem -Path "\\machine1\abc\123",它会显示 log 1.zip 的条目还是显示错误?此外,log 1.zip 是一个隐藏文件吗? - Lance U. Matthews
3个回答

26

这似乎在PowerShell v3上可以直接使用。我手头没有v2进行测试,但我知道有两个选项应该可以解决问题。首先,您可以映射PSDrives:

New-PSDrive -Name source -PSProvider FileSystem -Root \\machine1\abc\123 | Out-Null
New-PSDrive -Name target -PSProvider FileSystem -Root \\machine2\c$\Logs | Out-Null
Copy-Item -Path source:\log_1.zip -Destination target:
Remove-PSDrive source
Remove-PSDrive target

如果这是你经常要做的事情,你甚至可以将其封装在一个函数中:

Function Copy-ItemUNC($SourcePath, $TargetPath, $FileName)
{
   New-PSDrive -Name source -PSProvider FileSystem -Root $SourcePath | Out-Null
   New-PSDrive -Name target -PSProvider FileSystem -Root $TargetPath | Out-Null
   Copy-Item -Path source:\$FileName -Destination target:
   Remove-PSDrive source
   Remove-PSDrive target
}

或者,您可以在每个路径中显式地指定提供程序:

Copy-Item -Path "Microsoft.PowerShell.Core\FileSystem::\\machine1\abc\123\log 1.zip" -Destination "Microsoft.PowerShell.Core\FileSystem::\\machine2\\c$\Logs\"

7
最后这一步,在我的情况下,加上 Microsoft.PowerShell.Core\FileSystem:: 前缀就起作用了。谢谢。 - blachniet
2
你可以通过运行 powershell.exe -version 2 命令以 v2 模式运行 Powershell 3。你可以通过检查 $Host.Version 属性来验证这一点。 - qJake
太棒了!我不知道你可以在PowerShell 3中运行v2。我一直在测试需要在单独的虚拟机上运行v2的脚本,所以这个技巧会让事情变得*更加容易。感谢这个提示! - KevinD
谢谢,这解决了我的问题。有人能指点我一篇文章,解释为什么New-PSDrive有效而裸露的UNC路径无效吗?我猜这与FileSystem权限在PSDrive中正确显示有关... - MrEdmundo
@MrEdmundo 我不能确定,但我怀疑这是因为New-PSDrive指定要使用的提供程序是FileSystem。这有点像在路径中显式地使用提供程序,就像我的最后一个示例一样。 - KevinD
如果有人在使用此答案将文件从本地驱动器复制到UNC路径时犯了和我一样的错误,那么Microsoft.PowerShell.Core\FileSystem::前缀只应该用于UNC路径,而不是本地驱动器。否则,您将会收到一个“给定路径格式不受支持”的错误提示。 - Gavin Ward

4

这个对我来说一整天都有效:

$strLFpath = "\\compname\e$\folder"
$strLFpath2 = "\\Remotecomputer\networkshare\remotefolder"  #this is a second option that also will work
$StrRLPath = "E:\localfolder"  
Copy-Item -Path "$StrRLPath\*" -Destination "$strLFpath" -Recurse -force -Verbose

需要注意的事项: 在使用Copy-item命令时,将最后一个项目定义为对象。 如果要复制文件夹的内容,则必须使用“\*”符号。

如果您要将整个文件夹复制到新位置,则不需要声明其内容。


0

我每天都使用它:

Robocopy /E \\\SOURCEIP\C$\123\  \\\DESTIP\C$\Logs\   
                                             

中间有一个空格。对于ROBCOPY,/E表示复制。如果需要移动,请使用谷歌搜索。

或者:

$SourceIP = Read-Host "Enter the Source IP"

$DESTIP = Read-Host "Enter the Destination IP"

Robocopy /E \\\\$SourceIP\C$\123\  \\\\$DESTIP\C$\Logs\ 

####Just adjust the C$ path on both#####

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