在函数中为每个输入的参数重复一个动作

In function repeat an action for each entered parameter

我的主脚本 运行 一旦通过 -path 参数在指定的驱动器上进行 gci,然后它会从此输出中执行多个不同的 tables。下面是我的脚本的一部分,它从通过 -folder 参数指定的目录执行特定的 table,例如:

my-globalfunction -path d:\ -folder d:\folder

它工作正常,但仅适用于一个输入的文件夹路径,此脚本的目标是用户可以输入多个文件夹路径并为每个输入的 -folder 参数值获取一个 tables,如下所示:

Where-Object 中的这个条款将是问题所在:

$_.FullName.StartsWith($folder, [System.StringComparison]::OrdinalIgnoreCase)

传递的文件夹数组很可能被转换为一个永远不会匹配的长字符串。我发布了一个正则表达式解决方案,但在查看了您的逻辑尝试执行的操作后想起了一个更简单的方法。

更简单的方法

更简单的方法是将此信息直接放入 Get-ChildItem,因为它接受 -Path 的字符串数组。这样我认为你甚至不需要有 2 个参数,因为你永远不会再使用 $fol 的结果。基于您正在寻找 $folder

的所有子文件夹的假设
$gdfolders = Get-ChildItem -Path $folder -Recurse -Force | Where-Object{$_.psiscontainer}

这将 return 所提供路径的所有子文件夹。如果您有 PowerShell 3.0 或更高版本,这会更容易。

$gdfolders = Get-ChildItem -Path $folder -Recurse -Force -Directory

根据评论更新

您显示的代码不完整,这使我找到了您在上面看到的解决方案。如果你确实在其他地方使用了变量 $fol 而你没有显示,让我们回到我之前的正则表达式解决方案,它可以更好地代替你已有的。

$regex = "^($(($folder | ForEach-Object{[regex]::Escape($_)}) -join "|")).+"
....
$gdfolders = $fol | Where-Object{($_.Attributes -eq "Directory") -and ($_.FullName -match $regex)}

这将做的是构建一个正则表达式比较字符串,我假设是定位文件夹的逻辑,该逻辑以传递的任一路径开头。

使用您输入的 "d:\folder1", "d:\folder2" 示例,变量 $regex 将得出 ^(d:\folder1|d:\folder2)。适当的字符,如 \,由应用于每个元素的静态方法 [regex]::Escape 自动转义。然后我们使用 -join 放置一个管道,在这个正则表达式捕获组中意味着匹配左边的 或右边的 。为了完整起见,我们声明匹配必须出现在带有插入符号 ^ 的路径的开头,尽管这很可能是多余的。它将匹配以“d:\folder1”或“d:\folder2”开头的路径。在正则表达式字符串的末尾,我们有 .+,这意味着匹配 1 个到更多字符。这应该确保我们不匹配实际文件夹“d:\folder1”,而只是它的子文件夹

旁注

’Size (MB)’ 行中的引号不正确,是 '。如果您对该代码有疑问,请考虑更改引号。