PowerShell调用或执行(使用&运算符)带参数的函数?

qco9c6ql  于 2023-05-17  发布在  Shell
关注(0)|答案(3)|浏览(170)

我得到了这个ps片段:

function myFuncWithArgs($arg) { 
    Write-Output $arg 
}

$temp = 'sometext'

$cFunc = 'myFuncWithArgs' 
& $cFunc $temp

它可以工作,但我需要$temp与$cFunc在同一行,并且工作相同。这不起作用:

$cFunc = 'myFuncWithArgs' $temp
& $cFunc

这在pshell中可能吗?

2ledvvac

2ledvvac1#

看起来像是你试图将一个 * 完整的命令 *(可执行文件+参数)存储在一个变量中,以便 * 以后按需执行 *。
使用script block{ ... }),您可以使用调用操作符&按需调用:

# Define the full command as a script block.
$scriptBlock = { myFuncWithArgs $temp }

# Invoke it.
# You may also pass arguments to it, but that only makes sense
# if it is designed to accept them, e.g. via $args
& $scriptBlock

注意事项:

  • &不能处理包含完整命令的字符串。它的参数必须是一个脚本块,如图所示,或者是命令名或可执行文件路径,并且传递给该脚本块/命令/可执行文件的任何参数都必须单独指定,例如

& { Write-Output $args } arg1 ...& $pathToExecutable arg1 ...

  • 请继续阅读,了解如何执行存储在字符串中的完整命令,这可能是一个 * 安全风险 *。

上面使用了脚本块 literal
要从 string 创建脚本块,请使用[scriptblock]::Create()

# IMPORTANT: 
#  Be sure that you either fully control or implicitly trust
#  the content of this string, so as to prevent execution of unwanted code.
$commandString = 'myFuncWithArgs $temp'

$scriptBlock = [scriptblock]::Create($commandString)

& $scriptBlock

你提到Read-Host,即提示用户,作为命令字符串的来源,在这种情况下,上面的“重要:”下的警告肯定适用。

    • 如果 * 执行任意用户提供的命令的风险是可以接受的,您可以简单地使用Invoke-Expression$commandString-但请注意,Invoke-Expressiongenerally discouraged,因为它能够执行存储在字符串中的任意代码。
  • 然而,有一个中间地带,它 * 确实 * 需要[scriptblock]::Create()
  • 在调用脚本块之前,您可以调用它的.CheckRestrictedLanguage()方法,以确保生成的命令仅包含Restrictedlanguage mode中允许的命令,并可配置允许的特定命令和变量。
6bc51xsx

6bc51xsx2#

你可以一次赋值给多个变量,这样就可以保持在同一行:

$cFunc,$cArgs = 'myFuncWithArgs',$temp
& $cFunc @cArgs
g2ieeal7

g2ieeal73#

调用不带方括号的函数,调用不带逗号和白色的参数。

function Dartagnan($a, $b)
{
$c = $a + $b;
Write-Host $c;
#result is 12;
}
Dartagnan 5 7;
Read-Host;

相关问题