PowerShell Run Macro с динамическим параметром - PullRequest
0 голосов
/ 15 мая 2019

Я пытаюсь выполнить некоторые макросы через мой 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.'. Макрос может быть недоступен в этой книге или все макросы могут быть отключены. "---> System.Runtime.InteropServices.COMException: невозможно запустить макрос «Connections.openConnThroughParameters», «RMDeriv», «RMDeriv_uat», «UAT».Макрос может быть недоступен в этой книге или все макросы могут быть отключены.System.Runtime.InteropServices.COMException: Невозможно запустить макрос «Connections.openConnThroughParameters», «Param 1», «Param 2», «Param 3».Макрос может быть недоступен в этой книге или все макросы могут быть отключены

1 Ответ

0 голосов
/ 15 мая 2019

Код, который вы используете для цитирования аргументов, неверен, так как он пропускает первый символ кавычки в самом имени макроса.Кроме того, числовые параметры не нужно заключать в кавычки, если ваш макрос не может преобразовать эти значения, заданные в виде строки, обратно в числовые типы.

Возможно, использование небольшой вспомогательной функции для цитирования может помочь:

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

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...