问题描述
我正在寻找一种从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-命令'Write-Output“ $ parameters”'),但遇到了新问题-而且此命令被称为“危险”! 我想必须有一个更好的解决方案!?
背景: 我正在开发用于软件分发的帮助程序脚本,该脚本会自动运行带有记录(开始转录),错误处理等的主脚本。从配置文件中读取主脚本的参数。
解决方法
您可以在此处使用splatting:
$parameters = @{
Mode='Install'
InstallPath=${Env:ProgramFiles(x86)}
}
ScriptFile @parameters
除非您需要iex
在这里