Сценарий PowerShell работает хорошо от ISE, но имеет проблемы с cli - PullRequest
1 голос
/ 09 мая 2020

Я написал сценарий ps, который выполняет задание, когда я выполняю его из ISE, но когда я сохраняю его и запускаю из CMD, у меня есть ошибка, в основном я сделал gui со списком OU и списком GPO и я хотел создать ссылку и кнопку отмены связи (например, OU с именем blabla и GPO с именем GPOblabla, поэтому, если я проверю их оба и нажму ссылку, код будет связывать, а отключение приведет к отключению) проблема (насколько я понимаю) в button2 (unlink ), которая определена в начале кода, и в этой функции я использую команду, которая использует параметры позже в коде, я думаю, ISE сохраняет ее в памяти? что лучше всего здесь делать? вот код:

Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

$button2_click = {
try {Remove-GPLink -Name $GPO -target $OU}
catch {
Write-Warning $Error[0]
} $form.close() }

$form = New-Object System.Windows.Forms.Form
$form.Text = 'GPO Connector V1.0'
$form.Size = New-Object System.Drawing.Size(600,200)
$form.StartPosition = 'CenterScreen'

$button1 = New-Object System.Windows.Forms.Button
$button1.Location = New-Object System.Drawing.Point(10,120)
$button1.Size = New-Object System.Drawing.Size(75,23)
$button1.Text = 'Link'
$button1.DialogResult = [System.Windows.Forms.DialogResult]::OK
$form.AcceptButton = $button1

$button2 = New-Object System.Windows.Forms.Button
$button2.Location = New-Object System.Drawing.Point(90,120)
$button2.Size = New-Object System.Drawing.Size(75,23)
$button2.Text = 'UnLink'
$Button2.Add_Click($Button2_Click)

$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(80,20)
$label.Size = New-Object System.Drawing.Size(480,20)
$label.Text = 'SELECT GPO And Corresponding OU (ONLY WORKSTATION OU)'

$form.Controls.Add($label)
$form.Controls.Add($button1)
$form.Controls.Add($button2)

$listBox = New-Object System.Windows.Forms.ListBox
$listBox.Location = New-Object System.Drawing.Point(10,40)
$listBox.Size = New-Object System.Drawing.Size(260,20)
$listBox.Height = 80

$listBox2 = New-Object System.Windows.Forms.ListBox
$listBox2.Location = New-Object System.Drawing.Point(300,40)
$listBox2.Size = New-Object System.Drawing.Size(260,20)
$listBox2.Height = 80

#gpolist.txt holding the gpo's and oulist.txt would hold the ou's
Get-Content .\gpolist.txt | ?{$_ -notmatch "^#"}  | Where-Object { $_.Trim() -ne '' } | ForEach-Object {
[void] $listBox.Items.Add("$_")}

Get-Content .\oulist.txt | ?{$_ -notmatch "^#"} | Where-Object { $_.Trim() -ne '' } | ForEach-Object {
[void] $listBox2.Items.Add("$_")}

$form.Controls.Add($listBox)
$form.Controls.Add($listBox2)
$form.Topmost = $true
$result = $form.ShowDialog()


if ($result -eq [System.Windows.Forms.DialogResult]::Cancel)
{   break   }


if ($result -eq [System.Windows.Forms.DialogResult]::OK)
{
$GPO = $listBox.SelectedItem
$OU = $listBox2.SelectedItem    }

New-GPLink $GPO -target $OU | out-null }

1 Ответ

4 голосов
/ 09 мая 2020

Вы не устанавливаете переменные $GPO и $OU до после , показывающего диалог, поэтому эти переменные не будут определены в вашем блоке сценария $button2_click, поэтому вызов Remove-GPLink не будет работать должным образом.

Одним из способов решения проблемы является прямая ссылка на $listBox.SelectedItem и $listBox2.SelectedItem:

$button2_click = {
  try { 
    Remove-GPLink -Name $listBox.SelectedItem -target $listBox2.SelectedItem 
  }
  catch {
    Write-Warning $Error[0]
  }
  $form.close()
}

Обратите внимание, что если бы вы определяли переменные $GPO и $OU внутри этого блока сценария , вам нужно будет определить их как $script:GPO = ... и script:$OU = ..., если вы хотите также получить к ним доступ после закрытия диалогового окна.


Что касается , почему все работает в ISE :

ISE использует точечные источники ваших скриптов при их запуске, и при повторных вызовах переменные могут задерживаться и повлияет на последующие запуски.

Подразумевается, что вы выполняли хотя бы один запуск с получением пути кода $GPO = $listBox.SelectedItem и $OU = $listBox2.SelectedItem, что привело бы к нажатию кнопки 2 в последующие прогоны «работают».

...