Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
powershell的管道参数问题_Powershell - Fatal编程技术网

powershell的管道参数问题

powershell的管道参数问题,powershell,Powershell,我遇到了一个奇怪的问题,我不知道如何解释。我希望有人能给我点启示 我想创建一个函数,它接受数组的一个参数,比如说$scriptnames,如果用户愿意,可以从以前的结果中选择管道。我去掉了不相关的东西,以便更好地说明我的困惑 在模块的过程中,我从数组中读取每个项,然后只打印该项 我的职能: get-childitem | Select-Object $_.BaseName| Get-Test -Verbose 让我困惑的是: 情景1: 我使用此命令获取目录中的文件列表: get-childi

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

我想创建一个函数,它接受数组的一个参数,比如说$scriptnames,如果用户愿意,可以从以前的结果中选择管道。我去掉了不相关的东西,以便更好地说明我的困惑

在模块的过程中,我从数组中读取每个项,然后只打印该项

我的职能:

get-childitem | Select-Object $_.BaseName|
Get-Test -Verbose 
让我困惑的是:

情景1:

我使用此命令获取目录中的文件列表:

get-childitem | Select-Object {$_.BaseName}
已正确返回文件列表,但没有扩展名:

然而,当我将结果传输到函数时,我得到了以下打印结果:

请注意,添加了不需要的$\ BaseName=literal

情景2:

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

get-childitem | Select-Object $_.BaseName
结果并没有真正过滤掉basename

但在我的职能范围内:

get-childitem | Select-Object $_.BaseName|
Get-Test -Verbose 
未包括$\u basename文字:

然而,basename包含了扩展名,这让我很困惑

有人能看到有什么东西向你冲来吗?为什么会发生以下事情:

1为什么在场景1的打印输出中标记了$\ BaseName literal,这是我没有要求的

2为什么选择在场景2中似乎不起作用,但打印输出没有具有完全相同脚本的$\ baseName


3我需要在脚本中更正什么才能只打印文件名,而不带扩展名和文字$BaseName?

您没有指定如何调用函数,因此无法真正判断1有什么问题,您似乎返回的是数组而不是字符串

2是容易的。你应该写一封信

gci |select-object basename
而不是$\ basename

3可能与2有关

另外,如果您试图获取Basename并且不需要标头,请不要使用Select Object。您可以改为:

(get-childitem).basename | whatever
下面是如何使用上面提供的示例函数进行打印

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
哦,如果您希望通过管道将内容传输到它,那么您确实应该删除“强制”,否则会出现绑定错误:

Get-Test : Cannot bind argument to parameter 'scriptNames' because it is an empty string
当包含Select Object BaseName时,将返回一个具有1个属性BaseName的对象数组。将其切换为选择Object-ExpandProperty BaseName以执行所需操作,或者可以使用Get-ChildItem.BaseName来实现相同的结果

每当您看到预期的字符串(即文件名)而不是作为对象/哈希表返回时,即@{$\u.BaseName=Filename}。如果希望它也返回扩展名,请使用Name而不是BaseName。如果需要文件的完整路径,请在这种情况下使用FullName

要回答您的场景问题

这与预期一样,因为您只指定了要从对象返回的单个属性,但仍然返回对象。对象属性名为$\ BaseName,因为您是按照通常的调用方式定义它的,您只需要指定属性名称,而不包括$\ BaseName。在前面指示管道对象,即选择对象BaseName。在场景1中,由于周围的花括号,它也能正常工作

详细文本似乎默认为Name属性,即使您正在向其传递完整对象。场景2中的第一个示例返回完整对象,因为您错误地调用了Select对象

我认为我的初步答案应该包括解决方案


我将其创建为一个模块,将其放置在PS应该放置和识别模块的位置,然后使用导入模块加载模块。我还尝试使用..加载它\myFunction.ps1,它仍然具有相同的行为。我认为问题可能在于脚本,而不是如何加载脚本。但是,我是PS新手,所以我可能正在做一些我不想做的事情。我尝试使用basename而不是$\u.basename,但它仍然在做同样的事情……奇怪……我想你误解了。我指的是你叫你函数的那一行。那条线是什么?选择对象{$\u.BaseName}|您的函数?。在任何情况下,您都不应该使用{$\.baseline}或$\.baseline。使用我提到的最后一行aboe,并将函数名替换为“whatever”。看看这是否有助于错误选择对象{$\uu0.BaseName}->ForEach对象{$\u0.BaseName}太棒了!这就解释了!!非常感谢你!