Powershell'where'声明 - 不包含

时间:2013-12-05 22:23:00

标签: regex powershell where

我有一个简单的摘录形式一个更大的脚本,基本上我正在尝试进行递归文件搜索,包括子目录(以及排除的任何子项)。

clear
$Exclude = "T:\temp\Archive\cst"
$list = Get-ChildItem -Path T:\temp\Archive -Recurse -Directory
$list | where {$_.fullname -notlike $Exclude} | ForEach-Object {
Write-Host "--------------------------------------"
$_.fullname
Write-Host "--------------------------------------"
$files = Get-ChildItem -Path $_.fullname -File
$files.count
}

目前此脚本将排除 T:\ temp \ Archive \ cst 目录,但不包括 T:\ temp \ Archive \ cst \ artwork 目录。我正在努力克服这个简单的事情。

我已经尝试了 - 不喜欢(我真的没想到会这么做),还有我希望的 -notcontains

任何人都可以提供任何建议,我认为这需要正在进行的正则表达式匹配,我现在正在阅读,但不是很熟悉。

将来 $ exclude 变量将是一个字符串(目录)数组,但目前只是尝试使用直接字符串。

5 个答案:

答案 0 :(得分:3)

尝试:

where {$_.fullname -notlike "$Exclude*"}

您也可以尝试

where {$_.fullname -notmatch [regex]::Escape($Exclude) }

但不太喜欢的apporach更容易。

答案 1 :(得分:3)

如果在没有通配符的情况下使用,-like运算符与-eq运算符相同。如果您要排除文件夹T:\temp\Archive\cst及其下方的所有内容,则需要以下内容:

$Exclude = 'T:\temp\Archive\cst'

Get-ChildItem -Path T:\temp\Archive -Recurse -Directory | ? {
  $_.FullName -ne $Exclude -and
  $_.FullName -notlike "$Exclude\*"
} | ...

-notlike "$Exclude\*"只会排除$Exclude的子文件夹,而不会排除文件夹本身,而-notlike "$Exclude*"也会排除T:\temp\Archive\cstring这样的文件夹,这可能是不受欢迎的。

-contains运算符用于检查值列表是否包含特定值。它不检查字符串是否包含特定的子字符串。

有关详细信息,请参阅Get-Help about_Comparison_Operators

答案 2 :(得分:1)

尝试更改

$Exclude = "T:\temp\Archive\cst"

致:

$Exclude = "T:\temp\Archive\cst\*"

这仍然会返回文件夹CST,因为它是Archive的子项,但会排除cst下的任何内容。

或者:

 $Exclude = "T:\temp\Archive\cst*

但这也将排除在Archive下以“cst”开头的任何文件。 Graimer的答案也是如此,请注意尾随\以及它对你正在做的事情是否重要

答案 3 :(得分:1)

对于那些寻找类似答案的人来说,我最终选择了什么(解析通配符匹配的数组路径):

# Declare variables
[string]$rootdir = "T:\temp\Archive"
[String[]]$Exclude = "T:\temp\Archive\cst", "T:\temp\archive\as"
[int]$days = 90

# Create Directory list minus excluded directories and their children
$list = Get-ChildItem -Path $rootdir -Recurse -Directory | where {$path = $_.fullname; -not @($exclude | ? {$path -like $_ -or $path -like "$_\*" }) }

提供我需要的东西。

答案 4 :(得分:0)

我想补充一下,因为我最近回答了一个类似的问题。您可以使用-notcontains条件,但与直观相反的是,$ exclude数组必须位于表达式的开头。

这里是一个例子。

如果我执行以下操作,则不会排除任何项目,并且返回“ a”,“ b”,“ c”,“ d”

   $result = @()
   $ItemArray = @("a","b","c","d")
   $exclusionArray = @("b","c")
   $ItemArray | Where-Object { $_ -notcontains $exclusionArray }

如果我在表达式中切换变量,那么它将起作用并返回“ a”,“ d”。

   $result = @()
   $ItemArray = @("a","b","c","d")
   $exclusionArray = @("b","c")
   $ItemArray | Where-Object { $exclusionArray -notcontains $_ }

我不确定为什么阵列必须如此工作。如果其他人可以解释,那将是很好的。