当前位置: 首页 > 编程笔记 >

在PowerShell高级功能中解释ValueFromPipeline。

蒲功
2023-03-14
本文向大家介绍在PowerShell高级功能中解释ValueFromPipeline。,包括了在PowerShell高级功能中解释ValueFromPipeline。的使用技巧和注意事项,需要的朋友参考一下

考虑下面的示例,我们创建了Advanced函数来获取特定的过程信息,例如Process Name Process ID(PID),Start Time,Responding status等

function Get-ProcessInformation{
   [cmdletbinding()]
   param(
      [Parameter(Mandatory=$True)]
      [string[]]$name
   )
   Begin{
      Write-Verbose "Program started"
   }
   Process{
      Write-Verbose "Extracting Process Inforamtion" Get-Process $name | Select Name, ID, StartTime, Responding | ft - AutoSize
   }
   End{
      Write-Verbose "Function ends here"
   }
}

以上是高级功能示例。当我们运行以上命令时,它将为我们提供有关所选表的进程信息。

输出结果

PS C:\WINDOWS\system32> Get-ProcessInformation -name Chrome
Name    Id       StartTime          Responding
----    --       ---------          ----------
chrome 1284    24-04-2020 21:29:25    True
chrome 1316    24-04-2020 21:29:37    True
chrome 2004    25-04-2020 17:12:40    True
chrome 2676    26-04-2020 10:59:37    True
chrome 3096    24-04-2020 23:39:00    True
chrome 4660    25-04-2020 22:43:34    True
chrome 6040    24-04-2020 21:29:31    True
chrome 6548    26-04-2020 10:59:30    True
chrome 6592    26-04-2020 10:59:39    True
chrome 6644    25-04-2020 16:41:59    True
chrome 6780    26-04-2020 09:53:33    True
chrome 7392    25-04-2020 11:47:22    True
chrome 10540   26-04-2020 10:56:49    True
chrome 11288   24-04-2020 21:33:05    True
chrome 12088   26-04-2020 10:59:48    True
chrome 12100   24-04-2020 21:29:38    True
chrome 13112   26-04-2020 10:59:48    True
chrome 13460   26-04-2020 10:59:45    True

现在,我们将上面创建的函数作为管道输出传递,并检查它是否有效?

PS C:\WINDOWS\system32> "Chrome" | Get-ProcessInformation
cmdlet Get-ProcessInformation at command pipeline position 1
Supply values for the following parameters:
name:
Get-ProcessInformation : Cannot bind argument to parameter 'name' because it
is an empty string.
At line:1 char:12
+ "Chrome" | Get-ProcessInformation
+             ~~~~~~~~~~~~~~~~~~~~~~
   + CategoryInfo             : InvalidData: (:) [Get-ProcessInformation], Param eterBindingValidationException
   + FullyQualifiedErrorId    : ParameterArgumentValidationErrorEmptyStringNotAl
lowed,Get-ProcessInformation

这不起作用,因为此函数不兼容用作管道输入。它不使用“ chrome”作为输入,而是由于Mandatory参数而要求提供Name变量的值。我们只需要添加ValueFromPipeline()参数。由于我们已经在函数中使用了Mandatory参数,因此只需添加一个管道参数,如下所示。

function Get-ProcessInformation{
   [cmdletbinding()]
   param(
      [Parameter(Mandatory=$True,ValuefromPipeline=$True)]
      [string[]]$name
   )
   Begin{
      Write-Verbose "Program started"
   }
   Process{
      Write-Verbose "Extracting Process Inforamtion" Get-Process $name | Select Name, ID, StartTime, Responding | ft - AutoSize
   }
   End{
      Write-Verbose "Function ends here"
   }
}

现在,让我们检查一下它是否有效。

PS C:\WINDOWS\system32> "Chrome" | Get-ProcessInformation
Name    Id    StartTime          Responding
----    --    ---------          ----------
chrome 1284 24-04-2020 21:29:25    True
chrome 1316 24-04-2020 21:29:37    True
chrome 2004 25-04-2020 17:12:40    True
chrome 2676 26-04-2020 10:59:37    True
chrome 3096 24-04-2020 23:39:00    True
chrome 4660 25-04-2020 22:43:34    True
chrome 6040 24-04-2020 21:29:31    True
chrome 6548 26-04-2020 10:59:30    True
chrome 6592 26-04-2020 10:59:39    True
chrome 6644 25-04-2020 16:41:59    True
chrome 6780 26-04-2020 09:53:33    True
chrome 7392 25-04-2020 11:47:22    True
chrome 10540 26-04-2020 10:56:49   True
chrome 11288 24-04-2020 21:33:05   True
chrome 12088 26-04-2020 10:59:48   True

是的,它有效。现在,如果我们提供两个现有的进程名称作为输入怎么办,它将不会提供所需的结果,因为我们在参数部分声明的字符串不是数组,而是单个字符串变量。我们现在将其声明为String数组。

function Get-ProcessInformation{
   [cmdletbinding()]
   param(
      [Parameter(Mandatory=$True,ValuefromPipeline=$True)]
      [string[]]$name
   )
   Begin{
      Write-Verbose "Program started"
   }
   Process{
      Write-Verbose "Extracting Process Inforamtion"  Get-Process $name | Select Name, ID, StartTime, Responding | ft - AutoSize
   }
   End{
      Write-Verbose "Function ends here"
   }
}

现在检查输出。

PS C:\WINDOWS\system32> "Chrome","SkypeApp" | Get-ProcessInformation
Name    Id    StartTime          Responding
----    --    ---------          ----------
chrome 1284 24-04-2020 21:29:25    True
chrome 1316 24-04-2020 21:29:37    True
chrome 2004 25-04-2020 17:12:40    True
chrome 2676 26-04-2020 10:59:37    True
chrome 3096 24-04-2020 23:39:00    True
chrome 4660 25-04-2020 22:43:34    True
chrome 6040 24-04-2020 21:29:31    True
chrome 6548 26-04-2020 10:59:30    True
chrome 6592 26-04-2020 10:59:39    True
chrome 6644 25-04-2020 16:41:59    True
chrome 6780 26-04-2020 09:53:33    True
Name       Id    StartTime       Responding
----       --    ---------       ----------
SkypeApp 2552 21-04-2020 18:31:02    True

在这里,我们得到了期望的输出,但是对于每个新进程,我们都得到了标头,而我们并不需要它。我们需要组合的输出,因此我们将在此处使用foreach循环,并要求使用PSCustomObject收集数据。

function Get-ProcessInformation{
   [cmdletbinding()]
   param(
      [Parameter(Mandatory=$True,ValuefromPipeline=$True)]
      [string]$name
   )
   Begin{
      Write-Verbose "Program started"
      $out = @()
   }
   Process{
      Write-Verbose "Extracting Process Inforamtion" $procs = Get-Process $name
      foreach($proc in $procs){
      $out += [PSCustomObject]@{
         "Process_Name" = $proc.Name
         "PID" = $proc.Id
         "Start_Time" = $proc.StartTime
         "Responding?" = $proc.Responding
      }
   }
}
   End{
      $out
      Write-Verbose "Function ends here"
   }
}

当您检查上面的输出时,输出将按预期进行合并。

PS C:\WINDOWS\system32> "Chrome","SkypeApp" | Get-ProcessInformation
Process_Name    PID       Start_Time          Responding?
------------    ---       ----------          -----------
chrome          1284    24-04-2020 21:29:25    True
chrome          1316    24-04-2020 21:29:37    True
chrome          2004    25-04-2020 17:12:40    True
chrome          2676    26-04-2020 10:59:37    True
chrome          3096    24-04-2020 23:39:00    True
chrome          4660    25-04-2020 22:43:34    True
chrome          6040    24-04-2020 21:29:31    True
chrome          6548    26-04-2020 10:59:30    True
chrome          6592    26-04-2020 10:59:39    True
chrome          6644    25-04-2020 16:41:59    True
chrome          6780    26-04-2020 09:53:33    True
chrome          7392    25-04-2020 11:47:22    True
chrome          10540   26-04-2020 10:56:49    True
chrome          11288   24-04-2020 21:33:05    True
chrome          12088   26-04-2020 10:59:48    True
chrome          12100   24-04-2020 21:29:38    True
SkypeApp        2552    21-04-2020 18:31:02    True
 类似资料:
  • 本文向大家介绍在PowerShell高级功能中解释AllowEmptyString()和AllowEmptyCollection()。,包括了在PowerShell高级功能中解释AllowEmptyString()和AllowEmptyCollection()。的使用技巧和注意事项,需要的朋友参考一下 输出 - 在上面的示例中,您可以看到添加了参数之后,程序将接受Empty字符串。同样,当您添加参

  • 本文向大家介绍在PowerShell高级功能中解释强制属性。,包括了在PowerShell高级功能中解释强制属性。的使用技巧和注意事项,需要的朋友参考一下 输出结果 以上示例的结论是当强制参数指定为null或Empty值接受取决于数据类型并且所有集合都不接受null值时。

  • 本章将通过一个具体管理 Openflow switch 的例子来介绍一些比较高级的命令。 首先,启动 Mininet,执行 sudo mn --topo single,3 --mac --switch ovsk --controller remote 生成一个小的网络,三台主机连到一台交换机上,交换机为 OpenvSwitch 交换机,指定 remote 类型控制器(默认为本地)。

  • 下面内容将介绍使用Activiti的高级用例,它会超越BPMN 2.0流程的范畴。 因此,对于Activiti的明确目标和经验有利于理解这里的内容。 监听流程解析 bpmn 2.0 xml文件需要被解析为Activiti内部模型,然后才能在Activiti引擎中运行。 解析过程发生在发布流程或在内存中找不到对应流程的时候, 这时会从数据库查询对应的xml。 对于每个流程,BpmnParser类都会

  • 配置 移动设备上的游戏会遇到一些特殊的情景,比如游戏应用被切换至后台又切换回前台,正在玩游戏的时候电话来了,电话打完继续玩游戏,这些你在进行声音控制的时候都得考虑。 幸运的是,游戏引擎在设计的时候已经考虑到这些情景了,注意在 AppDelegate.cpp 中,有这样几个方法: // This function will be called when the app is inactive. Wh

  • DevEnv高级功能 本节介绍开发环境的高级功能,包括: 使用GPU开发环境 使用FDS FUSE存储 使用HDFS存储 使用HDFS FUSE存储 网络和安全 监控 定制开发环境Docker镜像