如何在 powershell 中将当前具有开关参数的字符串转换为函数

How to convert a string that currently has a switch parameter into a function in powershell

提问人:davidprogrammercdn 提问时间:9/4/2023 更新时间:9/5/2023 访问量:61

问:

我有一个这样的字符串:

“清理 - 全部”

如何将其转换为 PowerShell 中的可调用函数,包括开关?

我试着在整个字符串前面调用“&”。

我试着把绳子分成几部分,然后把它们叫在一起。

我使用“&”将字符串“CleanUp”的第一部分调用为函数,但我不知道如何转换开关参数以使用它。

字符串 PowerShell 函数 参数 switch-statement

评论


答:

0赞 Thor 9/4/2023 #1

通过管道:

"CleanUp -All" | iex

作为参数:

iex -Command "CleanUp -All"

作为功能:

function myfunc {
  CleanUp -All
}
1赞 mklement0 9/5/2023 #2
  • 包含命令行的字符串 - 即命令名称/路径加参数 - 不能使用 调用运算符 - 只能对命令名称/路径进行操作,需要单独传递任何参数 - 请参阅此答案&&

  • 虽然可以使用 Invoke-Expression 来执行包含整个命令行的字符串:

    • 一般情况下,最好避免使用 ()。Invoke-Expressioniex

    • 这样的调用 () 在两个方面不像函数iex 'CleanUp -All'

      • 它要求在重复调用中重新解析命令行。

      • 它不接受其他参数 - 除非您使用字符串插值使它们成为传递给 的字符串的一部分。iex

  • 更好的解决方案是创建一个脚本块,该脚本块仅解析一次,并且可以根据需要重新调用(或者,如果意图是直接在调用者的作用域中执行,则使用 点源运算符):&.

    # Create a script block from the command-line string, which you can
    # invoke on demand with & or . - e.g.: & $sb
    $sb = [scriptblock]::Create('CleanUp -All')
    
    • 如果还想支持传递参数,请附加到命令行字符串: @args

      $sb = [scriptblock]::Create('CleanUp -All' + ' @args')
      
    • 如果你想创建一个实际的命名函数,是最简单的解决方案,毕竟:Invoke-Expression

      # Define function 'Foo' which calls CleanUp -All with pass-through
      # arguments, if any.
      iex ('function Foo { ' + 'CleanUp -All' + ' @args }')