powershell

时间:2017-05-09 19:55:50

标签: powershell

我遇到了一个奇怪的问题,我不知道如何解释。我希望有人能为我解释一下。

我想创建一个带有数组参数的函数,假设$ 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}

文件列表在没有扩展名的情况下正确返回:

enter image description here

然而,当我将结果传递给我的函数时,我得到了这个打印出来:

enter image description here

注意添加了不需要的$ _。BaseName = literal。

情景2:

但是,如果我发出此命令:

get-childitem | Select-Object $_.BaseName

结果并没有真正过滤出基本名称

enter image description here

但在管道我的功能时:

get-childitem | Select-Object $_.BaseName|
Get-Test -Verbose 

$ _basename文字未包括在内:

enter image description here

但是,基本名称包含扩展名,这让我很困惑。

有人能看到一些刺激你的东西吗?以及为什么会发生以下事情

1)为什么在场景1的打印输出中标记了$ _.BaseName文字,我没有要求?

2)为什么select在方案2中似乎不起作用,但打印输出没有$ _。baseName与完全相同的脚本?

3)我需要在脚本中更正仅在没有扩展名且没有文字$ _ .BaseName的情况下打印出文件名?

2 个答案:

答案 0 :(得分:3)

当您加入Select-Object BaseName时,您将返回一个包含1个属性BaseName的对象数组。将其切换为Select-Object -ExpandProperty BaseName以执行您正在寻找的内容,或者您​​可以使用(Get-ChildItem).BaseName来获得相同的结果。

每当您看到预期为字符串的内容(即Filename)时,它将作为对象/哈希表(即@{$_.BaseName=Filename})返回。如果您想让它返回扩展程序,请使用Name代替BaseName。如果您想要文件的完整路径,请在这种情况下使用FullName

回答你的情景问题......

  1. 表现得如预期,因为您只指定了从对象返回的单个属性,但仍然返回对象。 object属性名为$_.BaseName,因为您使用它的方式定义了它(通常只需指定属性名称而不包括前面的$_.来指示管道对象,即{ {1}})。由于场景1中的周围花括号

  2. ,它也起作用了
  3. 详细文本似乎默认为Name属性,即使您将完整对象传递给它也是如此。方案2中的第一个示例返回完整对象,因为您未正确调用Select-Object。

  4. 我的初步答案应涵盖解决方案,我认为

答案 1 :(得分:0)

你没有说明你如何调用你的函数,所以不能真正说出#1的错误,看起来你正在返回一个数组而不是字符串

#2很容易。你应该写一下

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<span data-name="day">1</span>
<span data-name="day">2</span>
<span data-name="disabled">3</span>
<span data-name="day">4</span>
<span data-name="day">5</span>
<span data-name="day">6</span>
<span data-name="disabled">7</span>
<span data-name="day">8</span>
<span data-name="day">9</span>
<span data-name="other">10</span>

而不是$ _。basename。

#3可能与2相关。

此外,如果您尝试获取Basename并且不想使用标头,请不要使用Select-Object。你可以这样做:

gci |select-object basename

以下是使用您在上面提供的示例函数打印的方式

(get-childitem).basename | whatever

哦,你真的应该删除Mandatory,如果你想要把东西给它管道,否则你会收到绑定错误:

PS C:\> (gci).basename |get-test -ver
VERBOSE: Executing: batch
VERBOSE: Executing: DB
VERBOSE: Executing: Modules
VERBOSE: Executing: nix
VERBOSE: Executing: py
VERBOSE: Executing: utils
VERBOSE: Executing: Microsoft.PowerShellISE_profile
VERBOSE: Executing: Microsoft.PowerShell_profile
VERBOSE: Executing: PowerShellTranscripts