我有一个简单的摘录形式一个更大的脚本,基本上我正在尝试进行递归文件搜索,包括子目录(以及排除的任何子项)。
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 变量将是一个字符串(目录)数组,但目前只是尝试使用直接字符串。
答案 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 $_ }
我不确定为什么阵列必须如此工作。如果其他人可以解释,那将是很好的。