我遇到了一个奇怪的问题,我不知道该如何解释。我希望有人能为我阐明一些信息。

我想创建一个接受数组参数的函数,比如说$ 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}

文件列表已正确返回,没有扩展名:

powershell - Powershell的管道参数问题-LMLPHP

但是,当我将结果通过管道传递给函数时,我得到了以下打印内容:

powershell - Powershell的管道参数问题-LMLPHP

注意,添加了不需要的$ _。BaseName =文字。

方案2:

但是,如果发出此命令:
get-childitem | Select-Object $_.BaseName

结果并没有真正仅过滤掉基名

powershell - Powershell的管道参数问题-LMLPHP

但是当管道到我的职能:
get-childitem | Select-Object $_.BaseName|
Get-Test -Verbose

$ _basename文字不包括在内:

powershell - Powershell的管道参数问题-LMLPHP

但是,基本名称包括扩展名,这确实让我感到困惑。

有人可以看到你身上冒出什么东西吗?以及为什么会发生以下情况:

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中的花括号周围,它也起作用
  • 即使您将完整的对象传递给它,冗长的文本似乎仍默认为Name属性。方案2中的第一个示例将返回完整对象,因为您未正确调用Select-Object。
  • 我的最初答案应该涵盖解决方案,我认为
  • 关于powershell - Powershell的管道参数问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43878820/

    10-16 20:33