为什么 Powershell 中引号内的 $_.Name 包含完整路径?

为什么 Powershell 中引号内的 $_.Name 包含完整路径?

当我在 powershell 中运行它时,它会输出我的文件的名称(在本例中只有一个),没有完整路径:

PS C:\dev\temp> gci test.* | % { $_.Name }
test.txt

当我将名称放在引号中以进行字符串格式化时,它包含完整路径:

PS C:\dev\temp> gci test.* | % { "Name is: $_.Name" }
Name is: C:\dev\temp\test.txt.Name

这里到底发生了什么疯狂的魔法?我怎样才能获取没有完整路径的名称并将其用引号括起来进行格式化?我可以使用,"blah " + $_.Name + " blah"但看起来比较丑陋。

答案1

Powershell 会自动扩展双引号中的变量。它不会返回对象的名称属性,而是返回它认为您需要的值。

如果您想选择名称属性,您可以这样做:

gci test.* | % { "Name: $($_.Name)" }

这会强制 Powershell 首先评估括号中的表达式,以便它仅连接字符串和名称属性。

但更好的方法是这样的:

gci test.* | select name

为什么要将其变成一个字符串,从而终止管道的面向对象参数绑定?

编辑:

更好的方法是将内容输出到这样的文件中:

foreach($file in (gci test.*)) 
{
    ("Name: {0} is here {1}" -f $file.name,$file.fullname) | out-file C:\temp\log.txt -Append -Encoding utf8
}

相关内容