1

我正在寻找一种从 powershell 脚本中运行第二个 powershell 脚本的方法,其中参数存储在字符串变量中。这是一个非常简化的示例:

. $path\MainScript.ps1 -Mode $($objBMA.{Mode}) -InstallPath ${Env:ProgramFiles(x86)}

像这样一切正常。但显然您不能简单地将参数字符串“-Mode Install -InstallPath ${Env:ProgramFiles(x86)}”替换为变量,例如

$parameters = '-Mode Install -InstallPath ${Env:ProgramFiles(x86)}'
. $path\MainScript.ps1 $parameters

在这种情况下,没有变量扩展并且参数绑定无法正常工作,这意味着参数“Mode”不是“Install”而是“-Mode Install -InstallPath ${Env:ProgramFiles(x86)}”。

使用以下脚本“MainScript.ps1”进行测试:

param(
    [string]$Mode,
    [string]$InstallPath
)
"="*120
"Bound parameters passed to 'MainScript.ps1':"
$PSBoundParameters
"="*120
"Unbound parameters passed to 'MainScript.ps1':"
$args
"="*120

配置文件:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <MainScriptName>MainScript.ps1</MainScriptName>
  <MainScriptParameters>-Mode $($objBMA.{Mode}) -InstallPath ${Env:ProgramFiles(x86)}</MainScriptParameters>

我尝试了“Invoke-Expression”(例如 Invoke-Expression -Command 'Write-Output "$parameters"'),却遇到了新问题——而且据说这个命令是“危险的”!?我想一定有更好的解决方案!?

背景:我正在开发一个用于软件分发的帮助脚本,它会自动运行带有日志记录(开始-转录)、错误处理等的主脚本。主脚本的参数是从配置文件中读取的。

4

1 回答 1

0

您可以在此处使用喷溅:

$parameters = @{
Mode='Install'
InstallPath=${Env:ProgramFiles(x86)}
}
ScriptFile @parameters

除非你需要iex这里

于 2020-10-05T09:43:34.513 回答