PowerShell 技能连载 - 从命令行获取参数

在前一个技巧中,我们演示了如何从命令行中提取命令名,并忽略所有参数。今天,您将学习到如何用一个函数同时获取到命令名和参数。该函数将命令行分割为实际的命令名和它的参数,并返回一个自定义对象:

function Get-Argument
{
  param
  (
    $CommandLine
  )

  $result = 1 | Select-Object -Property Command, Argument

  if ($CommandLine.StartsWith('"')) 
  { 
    $index = $CommandLine.IndexOf('"', 1)
    if ($index -gt 0)
    {
      $result.Command = $CommandLine.SubString(0, $index).Trim('"')
      $result.Argument = $CommandLine.SubString($index+1).Trim()
      $result
    }
  }
  else
  {
    $index = $CommandLine.IndexOf(' ')
    if ($index -gt 0)
    {
      $result.Command = $CommandLine.SubString(0, $index)
      $result.Argument = $CommandLine.SubString($index+1).Trim()
      $result
    }
  }
}



Get-Argument -CommandLine 'notepad c:\test'
Get-Argument -CommandLine '"notepad.exe" c:\test'

结果如下:

这是一个实际应用中的例子:它获取所有运行中的进程,并返回每个进程的命令名和参数:

Get-WmiObject -Class Win32_Process |
  Where-Object { $_.CommandLine } |
  ForEach-Object {
    Get-Argument -CommandLine $_.CommandLine
  }  

以下是结果的样子:

既然命令和参数都分开了,您还可以像这样为信息分组:

Get-WmiObject -Class Win32_Process |
  Where-Object { $_.CommandLine } |
  ForEach-Object {
    Get-Argument -CommandLine $_.CommandLine
  } |
  Group-Object -Property Command |
  Sort-Object -Property Count -Descending |
  Out-GridView 

本文国际来源:Getting Arguments from Command Line

评论