我遇到了一个奇怪的问题,我不知道该如何解释。我希望有人能为我阐明一些信息。
我想创建一个接受数组参数的函数,比如说$ scriptnames,用户可以选择从以前的结果中通过管道传递它。我剥离了无关的东西,以更好地说明我的困惑。
在模块的过程中,我从数组中读取每个项目,然后仅打印该项目。
我的功能:
function Get-Test
{
[CmdletBinding()]
param
(
[parameter(mandatory=$true,
ValueFromPipeline=$True,
ValueFromPipelineByPropertyName=$true)]
[string[]]$scriptNames
)
BEGIN
{
}
PROCESS
{
foreach ($scriptName in $scriptNames)
{
Write-Verbose "Executing: $scriptname"
}
}
END{}
这就是令我困惑的地方:
方案1:
我使用以下命令来获取目录中文件的列表:
get-childitem | Select-Object {$_.BaseName}
文件列表已正确返回,没有扩展名:
但是,当我将结果通过管道传递给函数时,我得到了以下打印内容:
注意,添加了不需要的$ _。BaseName =文字。
方案2:
但是,如果发出此命令:
get-childitem | Select-Object $_.BaseName
结果并没有真正仅过滤掉基名
但是当管道到我的职能:
get-childitem | Select-Object $_.BaseName|
Get-Test -Verbose
$ _basename文字不包括在内:
但是,基本名称包括扩展名,这确实让我感到困惑。
有人可以看到你身上冒出什么东西吗?以及为什么会发生以下情况:
1)为什么在方案1的打印输出中标记了$ _。BaseName文字,而我并没有要求?
2)为什么选择似乎在方案2中不起作用,但是打印输出没有$ _。baseName具有完全相同的脚本?
3)我需要在脚本中更正什么才能仅输出不带扩展名且不带文字$ _。BaseName的文件名?
最佳答案
当包含Select-Object BaseName
时,您将返回具有1个属性BaseName
的对象数组。将其切换到Select-Object -ExpandProperty BaseName
即可完成所需的操作,也可以使用(Get-ChildItem).BaseName
获得相同的结果。
每当您看到预期为字符串(即Filename
)的东西,而是将其作为对象/哈希表(即@{$_.BaseName=Filename}
)返回时。如果要让它也返回扩展名,请使用Name
而不是BaseName
。如果您需要文件的完整路径,请在这种情况下使用FullName
。
要回答您的方案问题...
$_.BaseName
,是因为您通过调用它的方式定义了它(通常,您只需指定属性名称,而无需在前面包含$_.
即可指示管道对象,即Select-Object BaseName
)。由于场景1中的花括号周围,它也起作用关于powershell - Powershell的管道参数问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43878820/