PowerShell中ForEach与ForEach-Object结合Select无输出问题咨询
先明确前提:$s4a应该是一组文件对象(比如Get-ChildItem的返回结果),下面逐个拆解你列出的无效写法问题:
无效写法原因拆解
ForEach ($name in $s4a) {Select Name}Select-Object(简写Select)需要明确的输入对象。这个写法里没有告诉Select要从哪个对象里提取Name属性,PowerShell找不到可操作的目标,因此无输出。正确写法是给Select指定输入:$name | Select Name。ForEach ($name in $s4a) {Select $name.Name}Select的参数是属性名称字符串(比如Name),而不是属性的具体值。你这里传入的是$name.Name的实际值(比如test.txt),Select会尝试寻找名为test.txt的属性,显然文件对象没有这个属性,最终输出空对象,看不到有效内容。$s4a| ForEach-Object {Select$_.Name}
首先是语法错误:Select和$_.Name之间缺少空格,PowerShell会将其识别为一个未定义的命令Select$_.Name,直接无输出。就算补上空格,本质问题和上面一样——传入的是属性值而非属性名,同样无法得到有效结果。$s4a| ForEach-Object {Select Name}
和第一个无效写法逻辑一致:Select没有收到输入对象。在ForEach-Object块中,当前管道对象是$_,必须通过管道将$_传给Select,即$_ | Select Name,否则Select没有可操作的目标,自然无输出。
有效写法为什么可行
ForEach ($name in $s4a) {$name.Name}
直接访问循环变量$name的Name属性,直接输出属性的具体值,不需要依赖Select,因此能正常显示文件名。$s4a| ForEach-Object {$_ | Select Name}
明确将当前管道对象$_(即每个文件对象)传给Select-Object,指定提取Name属性,因此会输出包含Name属性的对象,显示出对应的文件名。
内容的提问来源于stack exchange,提问作者lles

