我想做什么:在删除个人资料之前,将用户个人资料的内容复制到其他位置作为备份。
我是如何尝试的:使用powershell和copy-item -recurse -path profileName
是否有任何方法可以排除交接点?
我当然从交接点得到奇怪的东西。我想最好的方法是复制包括交接点在内的所有内容,但即使我必须将它们排除在外以使其工作,我还是可以在恢复配置文件时小心地将它们留在原处,因为我不会经常这样做(希望永远不会)。无论如何,我可以使用-exclude并命名我在配置文件根目录下找到的所有连接点,但是有appdata \ local \ application数据等子文件夹连接点。那个实际上会成功复制循环,直到文件夹名称变得太大。极大的失败。无论如何,如果我能做像-filter {$ _。attributes -notmatch“ReparsePoint”}这样的事情会很棒,但当然过滤器只对文件/文件夹名称使用字符串。如果我使用Get-ChildItem -path profileLocation ,我必须使用-force或者我会遗漏任何隐藏/系统文件。但它也意味着我将得到相同的连接点,这个连接点无法使用此命令读取,并且在我使用管道Where-Object和管道复制项目进行过滤之前会生成错误。另外,我猜这种方法会非常慢。因此,无论哪种方式,它看起来唯一的选择是使用-exclude并键入所有子文件夹连接点。没有比这更直接的了吗?
我应该放弃Powershell命令并使用Robocopy.exe吗?
答案 0 :(得分:0)
使用robocopy肯定会更简单。你可以用PS做的是从win32_volume获取挂载点列表(搜索没有驱动器号的卷)。然后,您可以排除任何具有该名称的路径的文件。 像这样:
$exclude=gwmi win32_volume |?{$_.driveletter -eq $null} |select -expand name
ls C:\mountpoints\ -Recurse |%{
if( $_.PSIscontainer -eq $true) {$dir=$_.fullname}
else {$dir=$_.directoryname}
if ($exclude.trim('\') -notcontains $dir){ #copy here}}