2015-06-26 2 views
1

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

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

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

$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() 
+0

Мое хорошее предположение заключается в том, что '' $ ButtonCommand "' будет пустым внутри, даже если он выходит из области видимости внутри этого srcriptblock. – Matt

ответ

0

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

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

Есть несколько нитей об этом, но стоит отметить два here at SO и on TechNet

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

$btn.add_click({Start-Process -FilePath "$global:ButtonCommand"}) 
+0

Ваш код не работает, потому что я столкнулся с той же проблемой, что $ ButtonCommand NULL в этой области, но ваша ссылка решила проблему! Теперь я использую $ Global: ButtonCommand. Я не знал, что это проблема с областью, поэтому я не нашел решение на Stackoverflow. Трудно найти решение, если вы не знаете, что искать. Спасибо за помощь! – ddl

+0

@ddl Какая ссылка была бы такой? Я могу обновить ответ, чтобы отразить его, поскольку в этих ссылках содержится несколько подходов. – Matt

+0

отредактировал мой первый комментарий. Полезная ссылка была [link] (http://stackoverflow.com/questions/14740375/powershell-with-gui-will-not-set-variable) – ddl

Смежные вопросы