【问题标题】:Get-Childitem excluding partiallyGet-Childitem 部分排除
【发布时间】:2014-10-15 17:41:54
【问题描述】:

Get-ChildItem 有一个奇怪的问题。我正在尝试在 C: 驱动器中搜索办公文件,但排除其中的一些文件夹。为此,我尝试了很多方法。我首先尝试使用 Copy-item 直接排除,但没有奏效。然后我尝试了 Get-ChildItem ,但在某些文件夹中停止说访问被拒绝。

我在link 中尝试过这种方法。如果我只做一个文件夹,它会像预期的那样跳过它。但是即使该文件夹在排除列表中,也会搜索其他一些文件夹。

这是我的代码。

$source = "C:\"
$destination = "C:\Backup"
$Exclude =  @('*C:\PerfLogs*' , "Backup" , "boot" , "MSOCache" , "programdata" , "Recovery" ,        "TrueDelete" , "Users", "Windows", "Documents and Settings", "Program Files (x86)\Google\" , "System   Volume Information" , "`$Recycle.Bin" , "Config.Msi" , "bmm")
$includes ="*.xls " , "*.xlsx" , "*.doc" , "*.docx" , "*.ppt" , "*.pptx"
$items = Get-ChildItem $source -Recurse -Exclude $exclude -Include $includes | ?{ $_.fullname -notmatch "\\perflogs\\?" -or "\\backup\\?" } | Copy-Item -Destination $Destination -Container -Force

我最初想用文件夹树复制所有内容,但这也不起作用。运行此代码后,它首先在“Perflogs”处停止,如果我让它继续,它只会搜索并在排除列表中的其他一些文件夹上被拒绝访问。

Get-ChildItem:对路径“C:\PerfLogs\”的访问被拒绝。在 C:\pstools\backup\2.ps1:6 字符:10 + $items = Get-ChildItem $source -Recurse -Exclude $exclude -Include $includes | ? ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~

干杯!

【问题讨论】:

  • 您是从提升的提示符下运行它吗?此外,Where-object 子句很可能无法按您的意愿工作。 ?{ $_.fullname -notmatch "\\(perflogs|backup)\\?"} 将是我将如何做到的......虽然如果你修复第一部分,它主要是不需要的。
  • 嗨,马特,不,我不是。我需要能够在没有海拔的情况下运行它。除了“排除”部分外,一切都很好。谢谢。
  • 不是最好的解决方案,但您可能会默默地出错-ErrorAction SilentlyContinue。它仍然会获取文件夹的其余详细信息。
  • 这将部分工作。但是当涉及到“用户”文件夹时,它将开始复制我不想要的所有办公文件。

标签: powershell get-childitem


【解决方案1】:
$source = "C:\"
$destination = "C:\Backup"
$Exclude =  @("PerfLogs","Backup","boot","MSOCache","programdata","Recovery","TrueDelete","Users","Windows","Documents and Settings","Program Files \(x86\)\\Google\\","System Volume Information" ,'\$Recycle\.Bin',"Config\.Msi","bmm")
$includes ="*.xls " , "*.xlsx" , "*.doc" , "*.docx" , "*.ppt" , "*.pptx"
$regex = "($($Exclude -join "|"))"
$items = Get-ChildItem $source -Recurse -Include $includes -ErrorAction SilentlyContinue | 
        ?{ $_.fullname -notmatch $regex } #| Copy-Item -Destination $Destination -Container -Force

我认为它不会在读取目录之前将其排除在外,因此会出现错误。一个妥协是读取它可以读取的所有目录和文件(是的,我知道它很慢),因为它不能以提升的权限运行。在它能够读取的文件上,它将使用Where-Object-notmatch 一个从您的$exclude 变量构建的正则表达式字符串。如您所见,我不得不为正则表达式转义一些字符。因此,任何包含这些单词的文件都将被排除在外。

警告

目前它将排除backup.docx。如果这是一个问题,您可以将$Exclude 中的"backup" 编辑为"\\backup\\",以仅排除该目录中的文件。正则表达式再次需要\\,因为\ 是一个控制字符。当您觉得 Copy-Item 正常工作时,您可以取消注释它。

测试样本

在我自己的计算机上运行它未提升从以下目录返回 17 个文件。

C:\Program Files (x86)\InstallShield\2014\Samples\InstallScript\Cumulative Setu...
C:\Program Files (x86)\InstallShield\2014\Samples\InstallScript\Platform Suites...
C:\Program Files (x86)\InstallShield\2014\Samples\InstallScript\Serial Number V...
C:\Program Files (x86)\LibreOffice 3.6\program\python-core-2.6.1\lib              
C:\Program Files (x86)\Microsoft Office\Office14\1033                             
C:\Program Files (x86)\Simon Sez IT\SharePoint Foundation 2013 Training\exercis...
C:\Temp    

【讨论】:

  • 嗨,马特,感谢您抽出宝贵时间帮助我。但是当我测试你上面的脚本时,它并没有排除诸如“用户”之类的文件夹,我桌面上的文档被复制到了目标文件夹,这不应该发生。
  • 好的,@Besiktas,我再看看。
  • 您是否完全复制了我的代码?我刚刚再次测试以验证 Where-Object 是否正常工作,它跳过了我的桌面、文档、下载和 C:\Windows\ShellNew 目录。
  • 嗨,马特,对不起,这是我的错误。我有一个测试文件夹,里面有我的桌面项目进行测试,它从那里拿起它。非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-12
  • 2018-01-09
  • 1970-01-01
  • 2015-02-16
  • 2020-06-17
  • 1970-01-01
  • 2020-05-27
相关资源
最近更新 更多