提问人:davidprogrammercdn 提问时间:9/4/2023 更新时间:9/5/2023 访问量:61
如何在 powershell 中将当前具有开关参数的字符串转换为函数
How to convert a string that currently has a switch parameter into a function in powershell
问:
我有一个这样的字符串:
“清理 - 全部”
如何将其转换为 PowerShell 中的可调用函数,包括开关?
我试着在整个字符串前面调用“&”。
我试着把绳子分成几部分,然后把它们叫在一起。
我使用“&”将字符串“CleanUp”的第一部分调用为函数,但我不知道如何转换开关参数以使用它。
答:
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-Expression
iex
这样的调用 () 在两个方面不像函数:
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 }')
评论