具有动态参数的PowerShell Run Macro

时间:2019-05-15 16:15:06

标签: powershell

我试图通过动力壳通过动态方式执行一些宏。我收到包含宏名称和参数的字典,需要执行它。

这是代码。

想象一下,在$ParamContent中,我有以下变量:"Param 1"+'#'+"Param 2"+'#'+"Param 3"

$arguments = $MacroName + "'"

$ParamContent = $MacroParams.Split("{#}")

for ($i=0; $i -lt $ParamContent.count;$i++) {
    #$arguments += ",'" + $ParamContent[$i] + "'"
    $arguments += ",'" + $ParamContent[$i] + "'"
}

$arguments = $arguments.Substring(0,$arguments.Length-1)
write-host $arguments

$xl.run.Invoke($arguments)

实际错误如下:

  

System.Management.Automation.MethodInvocationException:异常   使用“ 31”参数调用“运行”:“无法运行宏   'Connections.openConnThroughParameters','RMDeriv','RMDeriv_uat','UAT'。   该宏可能在此工作簿中不可用,或者所有宏都可能是   禁用。” ---> System.Runtime.InteropServices.COMException:无法   运行宏   'Connections.openConnThroughParameters','RMDeriv','RMDeriv_uat','UAT'。   该宏可能在此工作簿中不可用,或者所有宏都可能是   禁用的。 System.Runtime.InteropServices.COMException:无法运行   宏'Connections.openConnThroughParameters','Param 1','Param   2','Param 3'。该宏可能不在此工作簿中或所有   宏可能已禁用

1 个答案:

答案 0 :(得分:0)

您用于引用参数的代码不正确,因为它在宏名称本身上省略了第一个引号字符。此外,除非您的宏可以将以字符串形式给出的这些值转换回数字类型,否则无需用引号引起来。

也许使用小的辅助函数进行引用可能会有所帮助:

function Quote-Param([object[]]$param) {
    # helper function to return given parameter(s) quoted unless they are numeric
    [decimal]$number = 0
    foreach ($p in $param) {
        if ([decimal]::TryParse($p, [ref]$number)) { $p } else { ('"{0}"' -f $p) }
    }
}

$MacroParams = "Param 1#Param 2#Param 3#123#blah#456.789"
$MacroName   = 'MyMacro'

$arguments = @(Quote-Param $MacroName)  # force as array for the first argument
$arguments +=  Quote-Param $MacroParams.Split("#")
$arguments = $arguments -join ','

Write-Host $arguments -ForegroundColor Yellow

这将返回一个$arguments字符串:

"MyMacro","Param 1","Param 2","Param 3",123,"blah",123456.789

修改

您的代码未显示您可能如何使用$xl创建$xl = New-Object -ComObject Excel.Application对象。

创建对象后,您可以设置一些属性,例如$xl.Visible = $false。您还可以设置一个属性,该属性允许运行宏或不运行AutomationSecurity

要启用宏:

$xl.AutomationSecurity = 1  # msoAutomationSecurityLow

您可以将此属性设置为以下任意值:

 Constant                          Value  Description
 --------                          -----  -----------
 msoAutomationSecurityLow          1      Enables all macros
 msoAutomationSecurityByUI         2      Uses the security setting specified in the Security dialog box
 msoAutomationSecurityForceDisable 3      Disables all macros in all files opened programmatically without showing any security alerts

希望这会有所帮助