有没有一种方法可以引用先前输入的命令的倒数第二个单词(例如 $^ 表示第一个单词, $$ 表示最后一个单词)

Is there a way to refer to the second last word of the previously entered command (like $^ for the first and $$ for the last word)

在PowerShell中,输入命令时,我可以用$^$$来引用最近输入的命令的第一个字和最后一个字的值。我想知道是否有快捷方式来引用倒数第二个、倒数第 n 个或第 n 个单词。

没有直接等同于 automatic variables you mention, but you can combine Get-History with PowerShell's language parser (System.Management.Automation.Language.Parser) 来实现您的意图:

function Get-PrevCmdLineTokens {

  # Get the previous command line's text.
  $prevCmdLine = (Get-History)[-1].CommandLine

  # Use the language parser to break it into syntactic elements.
  $tokens = $null
  $null = [System.Management.Automation.Language.Parser]::ParseInput(
    $prevCmdLine, 
    [ref] $tokens,
    [ref] $null   
  )

  # Get and output an array of the text representations of the syntactic elements,
  # (excluding the final `EndOfInput` element).
  $tokens[0..($tokens.Count - 2)].Text
 
}

示例:

PS> $null = Write-Output Honey "I'm $HOME"
PS> Get-PrevCmdLineTokens

以上结果:

$null
=
Write-Output
Honey
"I'm $HOME"

注:

  • $^$$一样,组成命令的标记是未扩展的,这意味着它们被表示为输入而不是内插值。

  • 然而,$^$$不同的,任何句法引用是保留(例如,"I'm $HOME" 而不是 I'm $HOME)。

    • 虽然您可以在上面的函数中使用 .Value 而不是 .Text 来去除句法引号,但是您会错过诸如 $null=.