Использование переменной $ для отправки аргумента -Filepath для Start-Process

Я использую PowerShell версии 3. У меня есть странная проблема, которую я хотел бы исправить. Я написал скрипт PowerShell, который читает конфигурационный CSV-файл (с путями и именами приложений) и создает форму с кнопками приложений. Когда я пытаюсь представить Start-Process FilePath аргумент с переменной это просто не будет работать. Когда я повторяю переменную, все правильно. Может быть, кто-то здесь знает, что не так и может помочь мне. Я получаю ошибку, что

Argument is NULL or empty in:
+ $btn.add_click({Start-Process -FilePath "$ButtonCommand"})

Я попытался решить проблему с помощью решения другого потока stackru:

$ButtonCommand = $ButtonCommand.replace("\","\\").replace('"',"")

и попытался представить $ButtonCommand с и без "" "

#Search Script Path, Locate Config File in same Path
$fullPathIncFileName = $MyInvocation.MyCommand.Definition
$currentScriptName = $MyInvocation.MyCommand.Name
$currentExecutingPath = $fullPathIncFileName.Replace($currentScriptName, "")
$ConfigFile = $currentExecutingPath + "admintools.conf"
#Read Config File
$StringArray = Get-Content $ConfigFile
#Count Lines in Config File
$ConfigLineCount = Get-Content $ConfigFile | Measure-Object –Line

# Create Button Function
function CreateButton ($ButtonCommand, $ButtonName, $ButtonLocX, $ButtonLocY, $ButtonSizeX, $ButtonSizeY)
{
$btn = New-Object System.Windows.Forms.Button
$btn.add_click({Start-Process -FilePath "$ButtonCommand"})
$btn.Text = $ButtonName
$btn.Location = New-Object System.Drawing.Size($ButtonLocX,$ButtonLocY)
$btn.Size = New-Object System.Drawing.Size($ButtonSizeX,$ButtonSizeY)
$btn.Cursor = [System.Windows.Forms.Cursors]::Hand
$btn.BackColor = [System.Drawing.Color]::LightGreen
$form.Controls.Add($btn)
}

# Define Form
Add-Type -AssemblyName System.Windows.Forms
$form = New-Object Windows.Forms.Form
$form.Size = New-Object Drawing.Size @(260,250)
$Form.Text = "Tools"
$form.StartPosition = "CenterScreen"

#For each line in the configfile a button gets created.
foreach ($ArrayLine in $StringArray) 
{
    $Ar = [string]$ArrayLine
    $Ar = $Ar.Split(";")
    $UserArray += @($Ar[1])
    CreateButton $Ar[0] $Ar[1] $Ar[2] $Ar[3] $Ar[4] $Ar[5]
}

#Show Form
$drc = $form.ShowDialog()

1 ответ

Решение

Вы столкнулись с проблемой объема. Внутри этого небольшого блока скриптов $buttoncommand не инициализируется. Одним из решений было бы объявить блок скрипта в его собственной переменной.

$clickEvent = {Start-Process -FilePath "$ButtonCommand"}
$btn.add_click($clickEvent)

Есть несколько потоков по этому поводу, но две, которые стоит отметить здесь, в SO и на TechNet

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

$btn.add_click({Start-Process -FilePath "$global:ButtonCommand"})
Другие вопросы по тегам