如何从PowerShell脚本启动Robocopy

3
我正在尝试从网络计算机的C:\驱动器传输用户数据到本地计算机的C:\驱动器。因此,我需要排除所有系统文件夹和隐藏文件夹。
这是我的PowerShell脚本内容:
$asset = Read-Host "What is the Asset Number?"
$useraiu = Read-Host "What is the user's AIU?"

$source = "\\$asset\C$\"
$dest = "C:\Temp\Dest"

$excludedFolders = '_SMSTaskSequence','inetpub','Program Files','Program Files (x86)','Swsetup','Users','Windows','CCM','Notes'

$myFolders = Get-ChildItem  -Path "\\$asset\C$\" -Directory | where { $_ -notin $excludedFolders }

$myFolders | foreach { robocopy $_  $dest /S /Z /MT /XJD /XA:SH /log+:"\\server\path\path\%asset%-to-%computername%-Transfer-Log.log" /NP /FP /V /TEE}

Read-Host "Press ENTER to quit"

当我执行 Write-Output $myFolders 时,它显示了我想要复制的正确目录。
看起来 robocopy 函数正在使用本地 C:\ 路径作为源。源应该是 \\$asset\C$\ 中列出的文件夹。
例如。 如果这个文件夹在旧计算机上是 \\computername\C$\Userfolder-Pictures,请使用 Robocopy 将该文件夹复制到本地计算机上的 C:\Userfolder-Pictures 运行脚本后,我从 Robocopy 得到了这个输出。
 Log File : \\server\path\path\%asset%-to-%computername%-Transfer-Log.log

-------------------------------------------------------------------------------
   ROBOCOPY     ::     Robust File Copy for Windows                              
-------------------------------------------------------------------------------

  Started : Mon Jun 08 11:11:28 2015

   Source : C:\WINDOWS\system32\Temp\
     Dest : C:\Temp\Dest\

    Files : *.*

  Options : *.* /V /FP /TEE /S /COPY:DAT /Z /NP /XJD /XA:SH /MT:8 /R:1000000 /W:30 

------------------------------------------------------------------------------

2015/06/08 11:11:28 ERROR 2 (0x00000002) Accessing Source Directory C:\WINDOWS\system32\Temp\
The system cannot find the file specified. 

1
尾部斜杠在源代码或路径中是不被接受的。 - ATek
这甚至不是问题所在。列出的源路径与我预期的完全不同或错误。 - rangerr
你期望那里会有什么?你验证过 $asset 不是 null 或空的了吗? - Ansgar Wiechers
1个回答

4

添加 Select-Object -ExpandProperty FullName 将会给你以字符串数组的形式提供文件夹的完整网络路径。你目前使用的 foreach 循环是在遍历 $myFolders 中的 DirectoryInfo 对象数组。

$myFolders = Get-ChildItem  -Path "\\$asset\C$\" -Directory | where { $_ -notin $excludedFolders } | Select-Object -ExpandProperty FullName

或者,如果你计划使用来自$myFolders的除FullName之外的信息,则可以将这一行更改为使用$_.FullName

$myFolders | foreach { robocopy $_.FullName  $dest /S /Z /MT /XJD /XA:SH /log+:"\\server\path\path\%asset%-to-%computername%-Transfer-Log.log" /NP /FP /V /TEE}

谢谢!Select-Object -ExpandProperty FullName 对我很有效。 - rangerr
其实我有一个问题。Robocopy的源代码正在正常工作,但我希望目标与源相同,但是在C:\驱动器上本地化。例如,源:\\计算机名称\Temp-Pictures,则目标为C:\Temp-Pictures。目前这种方式不起作用。你能帮忙解决吗? - rangerr
哦,我明白了。C:\Temp-Pictures(例如)在本地是否始终存在,还是每次都需要创建? - Samuel Prout
可能有更多“PowerShell”的方法来完成这个任务,但是正则表达式很简单。 $p = "\\SomeServer01\c$\path\to\something\" $local = $p -replace "\\\\[a-zA-Z0-9]+\\c\$","C:" - Samuel Prout
通常情况下,本地路径是不存在的。是否有一种方法可以获取类似于$dest的变量,该变量来自$myFolders,以便与Robocopy命令一起使用。例如,从上面的代码中,$myFolders获取了来自网络计算机“\computername\Temp-pictures”和其他文件夹的目录列表。我想将其复制到本地计算机的相同位置“C:\Temp-Pictures”,并对$myFolders找到的任何其他文件夹执行相同的操作。 - rangerr

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