Powershell - 与数组匹配
Powershell - match with array
我是 Powershell 的初学者,我可以使用一些脚本。但现在我遇到了这个小问题。
我有这个小脚本。我有一个包含一些文件 $ORIGEN 的文件夹。我需要获取所有与变量 $ARCHIVOS 中的 te 值匹配的名称文件,并将它们放入新变量 $DATA 中。
谁能告诉我如何将 $ARCHIVOS 中的名称与文件夹中的文件进行匹配?如果我在变量 $ARCHIVOS 中只使用 1 个值,它工作正常,但是当我有一个数组时,y 不匹配任何东西。我尝试了很多解决方案,但没有。
提前感谢您的帮助。对不起我的英语
$ORIGEN= "C:\FILES\"
$ARCHIVOS='MLR*.384', 'MP0*.384'
$data= Get-ChildItem $ORIGEN | Where-Object{$_.Name -match $ARCHIVOS}
Write-Host $data
结合 Get-ChildItem
(or, since you're not recursing, just Get-Item
) 与 *
和 -Include
,它(与 -Filter
不同)接受通配符模式的 数组 :[1]
Get-ChildItem -File $ORIGEN/* -Include $ARCHIVOS
-File
指示 Get-ChildItem
到 return 仅匹配 文件 (而不是目录)。
输入路径 ($ORIGEN
) 后附加的 /*
(\*
) 通配符是必需的,因为 _Include
和 -Exclude
,在没有 -Recurse
的情况下,仅应用于 输入路径本身 ,而不是它们的 子项 项。
- GitHub issue #3304 中讨论了这种令人惊讶的行为。
如果您只想匹配文件名称,只需访问 .Name
属性 Get-ChildItem
通过 (...)
调用的输出,grouping operator, which, thanks to member-access enumeration,returns 匹配文件的名称作为数组(假设至少有两个):
$fileNames = (Get-ChildItem -File $ORIGEN/* -Include $ARCHIVOS).Name
至于你试过的, $_.Name -match $ARCHIVOS
:
-match
operator operates on regular expressions (regexes), not on wildcard expressions,但您的 $ARCHIVOS
数组包含 通配符 表达式。
此外,-match
不(有意义地)接受 RHS 上的 array 正则表达式。
如果你确实想用 -match
解决这个问题(这不是必需的,因为顶部显示了更短和更有效的解决方案),你必须创建使用 交替 (|
):
的 单个 正则表达式
# Note how the individual patterns are now expressed as *regexes*
# and are *anchored* with ^ and $ to ensure that the *entire name* matches.
# By default, -match finds *substrings*.
$_.Name -match ('^MLR.*\.384$', '^MP0.*\.384$' -join '|')
[1] 此外,-Filter
- 对于 , 单一 模式通常优于 -Include
]performance 原因 - 不使用 PowerShell 的通配符语言,而是将匹配委托给主机平台的文件系统 API。这意味着 [0-9]
和 [fg]
等范围或字符集表达式 不 受支持,并且在 Windows 上,几个 legacy quirks 影响匹配行为 - 请参阅 了解更多信息。
我是 Powershell 的初学者,我可以使用一些脚本。但现在我遇到了这个小问题。 我有这个小脚本。我有一个包含一些文件 $ORIGEN 的文件夹。我需要获取所有与变量 $ARCHIVOS 中的 te 值匹配的名称文件,并将它们放入新变量 $DATA 中。 谁能告诉我如何将 $ARCHIVOS 中的名称与文件夹中的文件进行匹配?如果我在变量 $ARCHIVOS 中只使用 1 个值,它工作正常,但是当我有一个数组时,y 不匹配任何东西。我尝试了很多解决方案,但没有。 提前感谢您的帮助。对不起我的英语
$ORIGEN= "C:\FILES\"
$ARCHIVOS='MLR*.384', 'MP0*.384'
$data= Get-ChildItem $ORIGEN | Where-Object{$_.Name -match $ARCHIVOS}
Write-Host $data
结合 Get-ChildItem
(or, since you're not recursing, just Get-Item
) 与 *
和 -Include
,它(与 -Filter
不同)接受通配符模式的 数组 :[1]
Get-ChildItem -File $ORIGEN/* -Include $ARCHIVOS
-File
指示Get-ChildItem
到 return 仅匹配 文件 (而不是目录)。输入路径 (
$ORIGEN
) 后附加的/*
(\*
) 通配符是必需的,因为_Include
和-Exclude
,在没有-Recurse
的情况下,仅应用于 输入路径本身 ,而不是它们的 子项 项。- GitHub issue #3304 中讨论了这种令人惊讶的行为。
如果您只想匹配文件名称,只需访问 .Name
属性 Get-ChildItem
通过 (...)
调用的输出,grouping operator, which, thanks to member-access enumeration,returns 匹配文件的名称作为数组(假设至少有两个):
$fileNames = (Get-ChildItem -File $ORIGEN/* -Include $ARCHIVOS).Name
至于你试过的, $_.Name -match $ARCHIVOS
:
-match
operator operates on regular expressions (regexes), not on wildcard expressions,但您的$ARCHIVOS
数组包含 通配符 表达式。此外,
-match
不(有意义地)接受 RHS 上的 array 正则表达式。如果你确实想用
的 单个 正则表达式-match
解决这个问题(这不是必需的,因为顶部显示了更短和更有效的解决方案),你必须创建使用 交替 (|
):# Note how the individual patterns are now expressed as *regexes* # and are *anchored* with ^ and $ to ensure that the *entire name* matches. # By default, -match finds *substrings*. $_.Name -match ('^MLR.*\.384$', '^MP0.*\.384$' -join '|')
[1] 此外,-Filter
- 对于 , 单一 模式通常优于 -Include
]performance 原因 - 不使用 PowerShell 的通配符语言,而是将匹配委托给主机平台的文件系统 API。这意味着 [0-9]
和 [fg]
等范围或字符集表达式 不 受支持,并且在 Windows 上,几个 legacy quirks 影响匹配行为 - 请参阅