我的主脚本通过-path参数在指定的驱动器上运行一次gci,然后它从此输出执行多个不同的表。下面是我的脚本的一部分,它通过-folder参数指定目录中的特定表,例如:
my-globalfunction -path d:\ -folder d:\folder
它工作正常,但只对一个输入的文件夹路径,此脚本的目标是用户可以输入多个文件夹路径并为每个输入的文件夹参数值获取一个表,如下所示:
答案 0 :(得分:2)
Where-Object
中的此条款将成为问题:
$_.FullName.StartsWith($folder, [System.StringComparison]::OrdinalIgnoreCase)
传递的文件夹数组很可能被转换为一个永远不会匹配的长字符串。我发布了一个正则表达式解决方案,但在查看了您的逻辑尝试后,记得更简单的方法。
更简单的方法是将此信息直接放入Get-ChildItem
,因为它接受-Path
的字符串数组。这样我就不会认为您甚至需要有2个参数,因为您再也不会使用$fol
的结果。基于您正在寻找$folder
$gdfolders = Get-ChildItem -Path $folder -Recurse -Force | Where-Object{$_.psiscontainer}
这将返回所提供路径的所有子文件夹。如果你有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
放置一个管道,在此正则表达式捕获组中,该管道与右侧的左侧 OR 匹配。为了完整起见,我们声明匹配必须发生在带有插入符^
的路径的开头,尽管这很可能是多余的。它会匹配以" d:\ folder1"开头的路径。或者" d:\ folder2"。在正则表达式字符串的末尾,我们有。+表示匹配1到更多字符。这应该确保我们不匹配实际的文件夹" d:\ folder1"但是它的孩子们很乖。
旁注
’Size (MB)’
行中的引号不是'
的正确引号。如果您对该代码有疑问,请考虑更改引号。