Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Powershell';其中';语句-notcontains_Regex_Powershell_Where - Fatal编程技术网

Regex Powershell';其中';语句-notcontains

Regex Powershell';其中';语句-notcontains,regex,powershell,where,Regex,Powershell,Where,我有一个更大的脚本的简单摘录,基本上我尝试做一个递归文件搜索,包括子目录(和排除的任何子目录) 此时,此脚本将排除T:\temp\Archive\cst目录,但不排除T:\temp\Archive\cst\artwork目录。我正在努力克服这件简单的事情 我尝试了-notlike(我真的没想到会成功),但也尝试了-notcontains,这是我所希望的 有谁能给我一些建议,我想这需要一个正则表达式匹配,我现在正在阅读,但不是很熟悉 将来,$exclude变量将是一个字符串(目录)数组,但目前只是

我有一个更大的脚本的简单摘录,基本上我尝试做一个递归文件搜索,包括子目录(和排除的任何子目录)

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

我尝试了-notlike(我真的没想到会成功),但也尝试了-notcontains,这是我所希望的

有谁能给我一些建议,我想这需要一个正则表达式匹配,我现在正在阅读,但不是很熟悉

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

尝试更改

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

这仍将返回文件夹CST,因为它是存档的子项,但将排除CST下的任何内容

或:

但这也将排除归档文件中以“cst”开头的任何文件。Graimer的回答也是如此,但要注意尾随\如果它对您正在做的事情很重要,请尝试更改

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

这仍将返回文件夹CST,因为它是存档的子项,但将排除CST下的任何内容

或:

但这也将排除归档文件中以“cst”开头的任何文件。Graimer的回答也是如此,但要注意尾随\如果尾随对您的工作很重要,请尝试:

where {$_.fullname -notlike "$Exclude*"}
你也可以试试

where {$_.fullname -notmatch [regex]::Escape($Exclude) }
但是不喜欢的方法更容易。

试试:

where {$_.fullname -notlike "$Exclude*"}
你也可以试试

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

但是notlike apporach更容易。

在不使用通配符的情况下使用
-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
运算符用于检查值列表是否包含特定值。它不检查字符串是否包含特定的子字符串


有关更多信息,请参阅。

在不使用通配符的情况下使用
-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
运算符用于检查值列表是否包含特定值。它不检查字符串是否包含特定的子字符串


请参阅以获取更多信息。

对于那些寻找类似答案的人,我最终得到了什么(解析数组路径以进行通配符匹配):


提供了我需要的内容。

对于那些寻找类似答案的人,我最终得到了什么(解析数组路径以进行通配符匹配):


提供了我所需要的。

我想我会补充一下,因为我最近有一个类似的问题得到了解答。可以使用-notcontains条件,但与直觉相反的是,$exclude数组需要位于表达式的开头

这里有一个例子

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

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

我不知道为什么阵列必须以这种方式工作。如果有人能解释,那就太好了

编辑日期:20年12月12日-我现在知道要使用的另一个操作是“-in”和“in”


我想我会补充这一点,因为我最近有一个类似的问题得到了回答。可以使用-notcontains条件,但与直觉相反的是,$exclude数组需要位于表达式的开头

这里有一个例子

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

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

我不知道为什么阵列必须以这种方式工作。如果有人能解释,那就太好了

编辑日期:20年12月12日-我现在知道要使用的另一个操作是“-in”和“in”


这么简单。最后我使用了提供的第一个示例。我不知道通配符是这样被接受的!这就是
-like
运算符(即通配符)的要点:-)查看
获取有关\u比较\u运算符的帮助
了解更多信息。非常简单。最后我使用了提供的第一个示例。我不知道通配符是这样被接受的!这就是
-like
运算符(即通配符)的要点:-)查看
get help about\u comparison\u operators
了解更多信息。我最终选择了Graimer的答案,因为$Exclude list将由用户在运行时提供,比期望他们排除更安全*我最终选择了Graimer的答案,因为$Exclude list将由用户在运行时提供,比期望的更安全让他们排除*伟大的一点,我刚刚想到,我所说的可以排除想要的文件。我刚刚更新了我的答案以反映这一点。因此,我认为如果$Exclude包含“T:\Temp\Archive\CST”,那么使用$Exclude*应该可以,但是如果$Exclude包含尾部斜杠(“T:\Temp\Archive\CST\”),则不会排除原始排除文件夹。刚刚测试过,这正是我想要的happens@mhouston100当心这件事
   $result = @()
   $ItemArray = @("a","b","c","d")
   $exclusionArray = @("b","c")
   $ItemArray | Where-Object { $_ -notcontains $exclusionArray }
   $result = @()
   $ItemArray = @("a","b","c","d")
   $exclusionArray = @("b","c")
   $ItemArray | Where-Object { $exclusionArray -notcontains $_ }
$_ -notin  $exclusionArray