Start-Process передает хеш-таблицу в ArgumentList

Рассмотрим следующую ситуацию:

Контент MyScript.ps1:

Param (
    [String]$CountryCode,
    [String]$FilesPath,
    [String]$KeepassDatabase,
    [String]$KeepassKeyFile,
    [String]$EventLog = 'HCScripts',
    [String]$EventSource,
    [HashTable]$CitrixFarm = @{'Server1' = '6.5'}
)

$CountryCode
$FilesPath
$KeepassDatabase
$KeepassKeyFile
$EventLog
$EventSource
$CitrixFarm

Содержание Caller.ps1:

Param (
    $FilesPath = ".\MyScript.ps1",
    $EvenntLog = 'Test',
    $CountryCode = 'BNL',
    $KeepasDatabase,
    $KeepasKeyFile
)

$Arguments = @()
$Arguments += "-EventSource ""$AppName"""
$Arguments += "-EventLog ""$EventLog"""
$Arguments += "-FilesPath ""$((Get-Item $FilesPath).FullName)"""
$Arguments += "-CountryCode ""$CountryCode"""
$Arguments += "-KeepassDatabase ""$((Get-Item $KeepasDatabase).FullName)"""
$Arguments += "-KeepassKeyFile ""$((Get-Item $KeepasKeyFile).FullName)"""
$Arguments += "-CitrixFarm $CitrixFarm"

$StartParams = @{
    Credential   = $Credentials
    ArgumentList = "-File ""$ScriptPath"" -verb runas" + $Arguments
    WindowStyle  = 'Hidden'
}
Start-Process powershell @StartParams

Кажется, мы не можем найти способ передать [HashTable] для аргумента $CitrixFarm. Как можно добавить этот аргумент. или передать его сценарию, вызываемому Start-Process с повышенными разрешениями и в новом сеансе PowerShell?

При пропуске параметра $CitrixFarm все работает нормально. Так что проблема действительно заключается в передаче HashTable.


person DarkLite1    schedule 23.05.2018    source источник
comment
Чего вы пытаетесь достичь с помощью -verb runas?   -  person Maximilian Burszley    schedule 23.05.2018
comment
@TheIncorrigible1 -Verb runas запрашивает повышение прав.   -  person Bill_Stewart    schedule 23.05.2018
comment
@Bill_Stewart Я понимаю, что да, но нужно ли ему это? Почему он пытается запустить другой процесс powershell, если ему это не нужно?   -  person Maximilian Burszley    schedule 23.05.2018
comment
Вам нужно преобразовать хеш-таблицу обратно в нотацию объекта PowerShell с помощью функции.   -  person Dan Wilson    schedule 23.05.2018
comment
Как аргумент параметра $CitrixFarm должен выглядеть в командной строке?   -  person Bill_Stewart    schedule 23.05.2018
comment
@Bill_Stewart Параметр $CitrixFarm представляет собой простую хеш-таблицу, например -CitrixFarm @{'ServerName1' = 'XenApp 7.15'}   -  person DarkLite1    schedule 24.05.2018
comment
@DanWilson, твой ответ - единственный ответ, который работает. Очевидно, ArgumentList из Start-Process может принимать только [String] объектов. Если вы разместите свой ответ, я отмечу его как решенный. Спасибо :)   -  person DarkLite1    schedule 24.05.2018
comment
Я понимаю это. Но вы хотите преобразовать его в [String]. Как это должно выглядеть?   -  person Bill_Stewart    schedule 24.05.2018


Ответы (1)


Вы должны передавать хеш-таблицу в нотации объекта PowerShell, как если бы вы запускали скрипт из окна PowerShell.

Как вы строите строку, зависит от вас.

Ты мог

  • использовать шаблон строки
  • использовать быстрый и грязный вызов "@$((ConvertTo-Json $CitrixFarm -Compress) -replace ':','=')"
  • использовать функцию для преобразования объекта хеш-таблицы.

Ниже показано, чего вы пытаетесь достичь.

$Arguments = @()
...
$Arguments += "-CitrixFarm @{'Server1' = '6.5'}"

$StartParams = @{
    Credential   = $Credentials
    ArgumentList = "-File ""$ScriptPath"" -verb runas" + $Arguments
    WindowStyle  = 'Hidden'
}
Start-Process powershell @StartParams

Источник: Улучшенный ToString () Метод для хеш-таблиц

person Dan Wilson    schedule 24.05.2018