2016-04-01 1 views
1

Итак, я создал инструмент powershell с использованием форм .... и он работает ... нет ничего плохого в коде ниже, за исключением того, что он не будет работать в Powershell 3. Это должно быть 4 .. и я не могу найти ничего об этом, что характерно для 4.0.Код, кажется, требует Powershell 4, однако не может понять, почему

Я просмотрел все страницы Technet для командлетов я использую, и все они имеют те же функции, перечисленные на 3 и 4.

Любые идеи?

основная функция это ...

  1. Очищает 4 текстов коробки.

  2. см. Этот флажок, если только один элемент отмечен, будет прочитайте в данных в этом файле и ищите слова, начинающиеся с #.

  3. Если он найдет совпадение больше 4 в длину ... Я принимаю единственную переменную, найденную, так как все те, которые у нас будут, будут содержать более 4 букв. Я сделал это, потому что, если найден только один, .count не будет работать. Но если встречается 4 совпадения, длина .length будет 4 .. такая же, как если бы длина одного элемента была 4. Если длина 4 или меньше, я обрабатываю как 4 или менее индивидуальную переменную.
  4. я теперь передавать их в текст и AccessibleName полей на форме

, то в любом случае .. Я обновляю строку состояния.

Ничего особенного.

$btn_LoadOptions = New-Object System.Windows.Forms.Button 
$btn_LoadOptions.Font = New-Object System.Drawing.Font("Consolas", 8.25) 
$btn_LoadOptions.Location = New-Object System.Drawing.Point(156, 184) 
$btn_LoadOptions.Size = New-Object System.Drawing.Size(168, 23) 
$btn_LoadOptions.TabIndex = 11 
$btn_LoadOptions.Text = "Load Options" 
$btn_LoadOptions.UseVisualStyleBackColor = $true 
$btn_LoadOptions.add_Click({btn_LoadOptions_Click($btn_LoadOptions)}) 

function btn_LoadOptions_Click($object) 
{ 
    clean-messageboxes 
    if ($cbl_DefaultMessageChoices.CheckedItems.Count -eq 1) 
    { 
     $regex = [regex]'(#\w+)' 
    $found = Select-String -Pattern $regex -path $messagechoice -AllMatches | % { $_.Matches } | % { $_.Value } 
    if ($found.Length -gt 4) 
    { 
     $tb_MessageOption1.Text = $found 
     $tb_MessageOption1.AccessibleName = $found 
    } 
    else 
    { 
     $tb_MessageOption1.Text = $found[0] 
     $tb_MessageOption1.AccessibleName = $found[0] 
     $tb_MessageOption2.Text = $found[1] 
     $tb_MessageOption2.AccessibleName = $found[1] 
     $tb_MessageOption3.Text = $found[2] 
     $tb_MessageOption3.AccessibleName = $found[2] 
     $tb_MessageOption4.Text = $found[3] 
     $tb_MessageOption4.AccessibleName = $found[3] 
    } 
    $sb_TOC_PowerTools.Text = "Message Options Loaded" 
} 
else 
{ 
    $sb_TOC_PowerTools.Text = "No message choosen" 
} 
} 

function clean-messageboxes 
{ 
$tb_MessageOption1.Text = "" 
$tb_MessageOption2.Text = "" 
$tb_MessageOption3.Text = "" 
$tb_MessageOption4.Text = "" 
} 
+0

и да, я знаю, что я мог бы использовать более короткий код в else {} –

+0

Не могли бы вы немного рассказать о «не сработаете»? Это ведет себя по-другому? Это порождает ошибки? –

+0

поэтому ... когда я нажимаю кнопку на форме .. если у вас установлена ​​powershell 3 .. ничего не происходит .. если у вас установлено 4. Файл читается, а опции с 1 по 4 из них загружаются в ящиков нет проблем. –

ответ

4

Вы упоминаете в комментариях, что вы Присвоить переменной $messagechoice так:

$global:messagechoice = $pgmessagedefaults_path + "\" + ($cbl_DefaultMessageChoices.CheckedItems.ForEach({$f = ($_ + ".txt");return $f})) 

Метод .ForEach({}) расширение a PowerShell 4.0 feature, что объясняет, почему он не работает в PowerShell 3.0

Вместо этого используйте командлет ForEach-Object:

$global:messagechoice = $pgmessagedefaults_path + "\" + ($cbl_DefaultMessageChoices.CheckedItems |ForEach-Object {$_ + ".txt"}) 
+0

Yup .. вот что я подумал после того, как увидел ошибку. Я поднял эту команду. Я попробую убедиться, что он работает ... Так как мне пришлось делать $ f =, возвращаю $ f .. могу ли я сделать эту команду следующим образом. '$ global: messagechoice = $ pgmessagedefaults_path + "\" + ($ cbl_DefaultMessageChoices.CheckedItems | ForEach-Object {$ f = ($ _ + ".txt"); return $ f}) ' он, похоже, не работает правильно, без этого. Я не мог просто сделать $ _. ".txt" часть ... путь был испорчен таким образом –