我遇到了一个奇怪的问题,我不知道如何解释。我希望有人能为我解释一下。
我想创建一个带有数组参数的函数,假设$ 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 = literal。
情景2:
但是,如果我发出此命令:
get-childitem | Select-Object $_.BaseName
结果并没有真正过滤出基本名称
但在管道我的功能时:
get-childitem | Select-Object $_.BaseName|
Get-Test -Verbose
$ _basename文字未包括在内:
但是,基本名称包含扩展名,这让我很困惑。
有人能看到一些刺激你的东西吗?以及为什么会发生以下事情:
1)为什么在场景1的打印输出中标记了$ _.BaseName文字,我没有要求?
2)为什么select在方案2中似乎不起作用,但打印输出没有$ _。baseName与完全相同的脚本?
3)我需要在脚本中更正仅在没有扩展名且没有文字$ _ .BaseName的情况下打印出文件名?
答案 0 :(得分:3)
当您加入Select-Object BaseName
时,您将返回一个包含1个属性BaseName
的对象数组。将其切换为Select-Object -ExpandProperty BaseName
以执行您正在寻找的内容,或者您可以使用(Get-ChildItem).BaseName
来获得相同的结果。
每当您看到预期为字符串的内容(即Filename
)时,它将作为对象/哈希表(即@{$_.BaseName=Filename}
)返回。如果您想让它返回扩展程序,请使用Name
代替BaseName
。如果您想要文件的完整路径,请在这种情况下使用FullName
。
回答你的情景问题......
表现得如预期,因为您只指定了从对象返回的单个属性,但仍然返回对象。 object属性名为$_.BaseName
,因为您使用它的方式定义了它(通常只需指定属性名称而不包括前面的$_.
来指示管道对象,即{ {1}})。由于场景1中的周围花括号
详细文本似乎默认为Name属性,即使您将完整对象传递给它也是如此。方案2中的第一个示例返回完整对象,因为您未正确调用Select-Object。
我的初步答案应涵盖解决方案,我认为
答案 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