【问题标题】:Exclude list of directories from Get-ChildItem based on a CSV file根据 CSV 文件从 Get-ChildItem 中排除目录列表
【发布时间】:2018-08-22 01:16:02
【问题描述】:

目录结构如下:

目录:\\L04274\C$\Temp 模式 LastWriteTime 长度 名称 ---- ------------- ------ ---- d----- 2018 年 3 月 12 日下午 2:04 d----- 2018 年 3 月 13 日上午 11:34 f1 d----- 2018 年 3 月 13 日上午 11:33 f2

排除 CSV 文件包含一列(稍后可能会扩展到两列,其中也包括文件类型)。

排除目录 \\L04274\C$\Temp\f2\ \\L04274\C$\Temp\f1\

PowerShell 命令看起来像这样,但它似乎没有按预期执行:

$path = '\\L04274\C$\Temp\f1' 
$exclusion = @(Get-Content -LiteralPath '\\L04274\C$\Temp\Exclusions.csv')

Get-ChildItem -Path $path -Force -Exclude $exclusion

我希望看到的只是以下文件夹:

\\L04274\C$\Temp\AutomatedImportProcess\

【问题讨论】:

  • @JamesC。这不是我想做的。在您提到的问题中,他们使用以下内容排除:[$archive = archive,Archive,ARCHIVE] 我想从中读取将 csv 放入数组或某个列表中,并使用该列表排除文件夹/文件。因此,如果我想排除 f1 文件夹,则应使用条目“\\L04274\C$\Temp\f1\”来排除。如果我只想排除文本文件,则应使用“\\L04274KAMRANF\C$\Temp\f1*.txt”。
  • 我注意到的第一件事是您在 '\\L04274\C$\Temp\f1' 处执行 Get-ChildItem,但您的排除项以 C:\Temp 作为根目录。

标签: powershell


【解决方案1】:

Exclude 仅适用于文件名

事后您必须使用嵌套的Where-Object 语句:

$path = '\\L04274\C$\Temp\f1' 
$exclusions = @(Import-Csv -LiteralPath '\\L04274\C$\Temp\Exclusions.csv') |Select-Object -Expand ExcludeDirectory

Get-ChildItem -Path $path -Force |Where-Object {
    $FullName = $_.FullName
    -not($exclusions|Where-Object {
        $FullName -like "$_*"
    })
}

如果完整路径不匹配任何排除项,-not(...) 语句将返回 $true,否则将省略该文件

【讨论】:

  • 感谢这引发了异常,但它确实给了我一个想法,让我解决了这个问题:
  • FYI 异常如下:Select-Object:找不到属性“ExcludeDirectory”。在 C:\Users\kamranf\Documents\PoweShellScripts\Untitled15.ps1:2 char:85 + ... RANF\C$\Temp\Exclusions.csv') |Select-Object -Expand ExcludeDirectory + ~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (ExcludeDirectory:PSObject) [Select -Object], PSArgumentException + FullyQualifiedErrorId : ExpandPropertyNotFound,Microsoft.PowerShell.Commands .SelectObjectCommand
  • @KamranFarzami 我的错误,应该是Import-Csv 而不是Get-Content
【解决方案2】:

这行得通:

$path = '\\L04274\C$\Temp' 
$exclusion = @(Get-Content -LiteralPath '\\L04274\C$\Temp\Exclusions.csv')

 (Get-ChildItem -Path $path -Force -Exclude $exclusion | ForEach-Object -Process { 
  $allowed = $true 
  foreach ($exclude in $exclusion) { 
     if ( $_.FullName  -like $exclude) {  
       $allowed = $false
       break
    }

  }
  if ($allowed) {
    $_ 
  }
 }).FullName

【讨论】:

  • 请注意"\\L04274\C$\Temp\f2\file.txt" -like "\\L04274\C$\Temp\f2\" 是假的。你需要它是"\\L04274\C$\Temp\f2\file.txt" -like "\\L04274\C$\Temp\f2\*" 才能成立。不过,不确定你在追求什么。
猜你喜欢
  • 1970-01-01
  • 2020-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-08
  • 2014-01-08
  • 2020-12-12
相关资源
最近更新 更多