我有这个目录/文件结构:
S:\My Folder\BaseName 1\
S:\My Folder\BaseName 1\BaseName 1 1.lnk
S:\My Folder\BaseName 1\BaseName 1 1.txt
S:\My Folder\BaseName 1.lnk
S:\My Folder\BaseName 1.txt
S:\My Folder\BaseName 2\
S:\My Folder\BaseName 2\BaseName 2 1.lnk
S:\My Folder\BaseName 2\BaseName 2 1.txt
S:\My Folder\BaseName 2.lnk
S:\My Folder\BaseName 2.txt
我有一个脚本,它在目录中寻找 * .lnk文件,然后处理与找到的 *.lnk 具有相同 BaseName 的任何其他文件/文件夹。
当脚本解析 * S:\My Folder*时,它会找到BaseName 1.lnk和BaseName 2.lnk
现在我需要在S:\My Folder中找到所有具有相同 BaseNames 的子项(并且只能在那里找到,而不在子文件夹中),因此我需要找到BaseName 1文件夹和BaseName 1.txt文件。
但我无法做到这一点:
Get-ChildItem -Path ".\BaseName 1" -exclude *.lnk
返回目录BaseName 1的内容,这是我不需要的。Get-ChildItem -Path ".\BaseName 1*" -exclude *.lnk
仅返回BaseName 1.txt和目录BaseName 1的内容,这是我不想要的。Get-ChildItem -Path ".\BaseName 1.*" -exclude *.lnk
仅返回BaseName 1.txt但不返回我需要的目录BaseName 1。Get-ChildItem -Path "." -include "BaseName 1" -exclude *.lnk -recurse
仅返回目录BaseName 1,但不返回BaseName 1.txt文件Get-ChildItem -Path "." -include "BaseName 1*" -exclude *.lnk -recurse
返回所有内容,但同样,我不想要目录BaseName 1的内容
我应该怎么办?
使用
Get-Item
而不是Get-ChildItem
:.\BaseName 11
更严格地(例如,假设上述内容也匹配):至于您尝试过的:
撇开这一点
Get-Item
从概念上来说也是更好的选择,因为您不是在寻找通配符表达式匹配的子项,所以与之结合时观察到的行为肯定令人惊讶(在 Windows PowerShell v5.1 和PowerShell(Core)7中观察到,从 v7.5.0 开始):".\BaseName 1*"
Get-ChildItem
-Exclude
默认情况下,通配符匹配的目录将被报告为其自身,而不是报告其子项(如果使用文字名称,则总是会发生后者)。
令人惊讶的是,
-Exclude
这种行为被隐性地修改,以报告儿童并对他们实施排斥。如果
-Include
使用,行为就会变得非常错误:除了意外触发子项的报告外,与一样
-Exclude
,模式首先与项目名称本身进行匹配,如果不匹配,则子项不匹配。例如,
Get-ChildItem foo* -Include *.txt
永远不会匹配任何东西,因为*.txt
无法匹配解析为的任何目录名称foo*
。所有问题
-Include
/-Exclude
行为的摘要均可在此答案的底部找到。