none
Powershell. Windows forms, вопросы по вводу информации в текстовое поле

    Вопрос

  • Добрый день. Изучаю GUI в PS, возникло несколько вопросов. Может кто поможет...

    1) Можно ли для richbox с multiline сделать ограничение, скажем на ввод 5ти строк? Если нет может это можно реализовать какими то другими способами или другими компонентами?

    2) Как сделать фильтрацию серверов, если копировать их пачкой вместе с лишними символами (пробелы и прочее псевдо)

    Пример cписка серверов:

    sdfsdf. serv-123-comb-1 01!!3№№:?0gfdDSDdff

    sdffffff!#srv1-2.sdfsdfsdsdf

    Каким образом можно отсечь все лишнее? Я думаю фильтрация должна быть по  тире и пробелам с псевдо вначале и вконце имени.

     код: 

    #------------------------------главная форма-----------------------------------------------------
    
    [void][System.Reflection.Assembly]::LoadWithPartialName( "System.Windows.Forms") 
    [void][System.Reflection.Assembly]::LoadWithPartialName( "Microsoft.VisualBasic") 
    [void][System.Windows.Forms.Application]::EnableVisualStyles()
    $form = New-Object "System.Windows.Forms.Form"; # создаем объект формы
    $form.Width = 630; # ширина
    $form.Height = 450; # высота  
    $form.Text = "Add"; # название формы
    $form.StartPosition = "CenterScreen" # центрируем
    $form.MaximizeBox = $false        # отключил развертывание окна
    $form.FormBorderStyle = 'Fixed3d' # фиксированная форма
    
    
    #---------------- Кнопка Выполнить
    $Run = New-Object System.Windows.Forms.Button
    $Run.Location = New-object System.Drawing.Size(470,260)
    $Run.Size = New-Object System.Drawing.Size(100,40)
    $Run.Text = "Выполнить"
    $Run.Add_Click(
    {
    #------------------- Предоставление доступа Change
    if ($radioRW.Checked){
    $servers = $richbox2.Text.split()
    $ShareDescription = " "
    $Users  = $getDomain+"\"+$richbox3.text
    
    foreach ($server in $servers){
    
    $1 = $richbox5.text -replace ':','$' # замена : на $
    $sharep = "\\$server\$1" # создаем переменную sharep
    if(!(Test-Path $Sharep))
    {New-Item -Path $ShareP -ItemType Directory 
    Write-Host "папка $ShareP создана" -ForegroundColor DarkGreen
    }
    else
    {
    Write-Host "папка $ShareP существует" -ForegroundColor Cyan
    }
    Start-Sleep -Seconds 2 #пауза на время создания папки
    $1 = $richbox5.text -replace ':','$' # замена : на $
    $sharep = "\\$server\$1" # создаем переменную sharep
    $acl = (get-item $Sharep).GetAccessControl('Access')
    $ar = New-Object System.Security.AccessControl.FileSystemAccessRule($Users, "Modify", "ContainerInherit,ObjectInherit", "None", "Allow")
    $acl.SetAccessRule($ar)
    set-acl $Sharep $acl
    }
    }
    
    })
    $form.Controls.Add($Run)
    
    
    #-------- Текстовое поле ввода серверов --------------------------------------
    $richbox2 = New-Object System.Windows.Forms.RichTextBox
    $richbox2.Location = New-Object System.Drawing.Size(20,40)
    $richbox2.Size = New-Object System.Drawing.Size(200,300)
    $richbox2.ScrollBars = "Vertical"
    $richbox2.Multiline = $true
    $richbox2.Font = 'Segoe UI'
    #$richbox2.AppendText("`n")
    $form.Controls.Add($richbox2)
    
    #-------- Текстовое поле ввода пользователей 1 --------------------------------
    $richbox3 = New-Object System.Windows.Forms.RichTextBox
    $richbox3.Location = New-Object System.Drawing.Size(240,40)
    $richbox3.Size = New-Object System.Drawing.Size(200,23)
    $richbox3.ScrollBars = "Vertical"
    $richbox3.Multiline = $false
    $richbox3.Font = 'Segoe UI'
    $form.Controls.Add($richbox3)
    
    
    
    #-------- Путь до папки --------------------------------
    $richbox5 = New-Object System.Windows.Forms.RichTextBox
    $richbox5.Location = New-Object System.Drawing.Size(240,155)
    $richbox5.Size = New-Object System.Drawing.Size(350,23)
    $richbox5.ScrollBars = "Vertical"
    $richbox5.Multiline = $false
    $richbox5.Font = 'Segoe UI'
    $form.Controls.Add($richbox5)
    
    ##--------------- Переход к радиокнопкам
    ##--------------- Радиокнопка RW, предоставление прав Change
    $radioRW = New-Object System.Windows.Forms.RadioButton
    $radioRW.Text = "RW"
    $radioRW.Location = '470,60'
    $radioRW.AutoSize = $true
    $radioRW.Checked = $false
    $form.Controls.add($radioRW)
    $label1 = New-Object System.Windows.Forms.Label
    $label1.Text = "Список серверов"
    $label1.Location = New-Object System.Drawing.Point (20,20)
    $label1.AutoSize = $true
    $form.Controls.Add($label1)
    ##--------------- Надпись "Список групп"
    $label2 = New-Object System.Windows.Forms.Label
    $label2.Text = "Группа"
    $label2.Location = New-Object System.Drawing.Point (240,20)
    $label2.AutoSize = $true
    $form.Controls.Add($label2)
    ##--------------- Надпись "Путь до папки"
    $label3 = New-Object System.Windows.Forms.Label
    $label3.Text = "Путь до папки"
    $label3.Location = New-Object System.Drawing.Point (240,135)
    $label3.AutoSize = $true
    $form.Controls.Add($label3)
    
    
    $form.ShowDialog()
    

    26 декабря 2017 г. 11:48

Ответы

  • 1. Ограничить можно

    $richbox2.Add_TextChanged({
        $MAX = 5 
    
        if($richbox2.Lines.Length -gt $MAX) {
            $richbox2.Lines = $richbox2.Lines | Where {$_.Trim()} | Select -First $MAX 
        }
    })

    2. Шаблоны плохие и нет возможности определить имя сервера

    sdfsdf. - нормальное имя

    serv-123-comb-1 -номарльное имя

    01!!3№№:?0gfdDSDdff - возможно мусор

    sdffffff!#srv1-2.sdfsdfsdsdf - как вся строка, так и частично подпадает под имя

    • Помечено в качестве ответа KazunEditor 31 декабря 2017 г. 9:20
    26 декабря 2017 г. 13:26
    Отвечающий
  • Самое простое написать свою функцию для фильтрации и нажимать по кнопке. Для базовой фильтрации можно в этом же событии:

    $richbox2.Add_TextChanged({
        $MAX = 5 
    
        if($richbox2.Lines.Length -gt $MAX) {
            $richbox2.Lines = $richbox2.Lines | Where {$_.Trim()} | Select -First $MAX 
        }
        
        if($richbox2.Lines -match "-") {
            $isChanged = $false
            $Lines = $richbox2.Lines | Where {$_}
            
            for($i = 0; $i -lt $richbox2.Lines.Count; $i++) {
                if($Lines[$i] -match "-" -and $Lines[$i] -match "\s|#" ) {
                    $Lines[$i] = $Lines[$i].Trim().split(" #") -match "-"
                    $isChanged = $true
                }
            }
            
            if($isChanged) {
               $richbox2.Lines = $Lines 
            }      
        }
    
    })

    Если я правильно понял фильтрация нужна по дефису, ну как то так, если в этом же событии, но это довольно жестко, лучше наверное через кнопку:

    $richbox2.Add_TextChanged({
        $MAX = 5 
    
        if($richbox2.Lines.Length -gt $MAX) {
            $richbox2.Lines = $richbox2.Lines | Where {$_.Trim()} | Select -First $MAX 
        }
        
    $richbox2.lines = $richbox2.lines.split() | ? {$_ -like '*-*'}
    
    })


    ну я такой прихожу и мур, мур, мур!

    • Помечено в качестве ответа Sel83 12 января 2018 г. 14:54
    12 января 2018 г. 4:58

Все ответы

  • 1. Ограничить можно

    $richbox2.Add_TextChanged({
        $MAX = 5 
    
        if($richbox2.Lines.Length -gt $MAX) {
            $richbox2.Lines = $richbox2.Lines | Where {$_.Trim()} | Select -First $MAX 
        }
    })

    2. Шаблоны плохие и нет возможности определить имя сервера

    sdfsdf. - нормальное имя

    serv-123-comb-1 -номарльное имя

    01!!3№№:?0gfdDSDdff - возможно мусор

    sdffffff!#srv1-2.sdfsdfsdsdf - как вся строка, так и частично подпадает под имя

    • Помечено в качестве ответа KazunEditor 31 декабря 2017 г. 9:20
    26 декабря 2017 г. 13:26
    Отвечающий
  • 1. Ограничить можно

    $richbox2.Add_TextChanged({
        $MAX = 5 
    
        if($richbox2.Lines.Length -gt $MAX) {
            $richbox2.Lines = $richbox2.Lines | Where {$_.Trim()} | Select -First $MAX 
        }
    })

    2. Шаблоны плохие и нет возможности определить имя сервера

    sdfsdf. - нормальное имя

    serv-123-comb-1 -номарльное имя

    01!!3№№:?0gfdDSDdff - возможно мусор

    sdffffff!#srv1-2.sdfsdfsdsdf - как вся строка, так и частично подпадает под имя

    1. Спасибо, попробую

    2.

    имя serv-123-comb-1, srv1-2 

    для имен без тире предполагаю отключать фильтрацию и делать список руками




    • Изменено Sel83 27 декабря 2017 г. 10:04
    27 декабря 2017 г. 9:57
  • Самое простое написать свою функцию для фильтрации и нажимать по кнопке. Для базовой фильтрации можно в этом же событии:

    $richbox2.Add_TextChanged({
        $MAX = 5 
    
        if($richbox2.Lines.Length -gt $MAX) {
            $richbox2.Lines = $richbox2.Lines | Where {$_.Trim()} | Select -First $MAX 
        }
        
        if($richbox2.Lines -match "-") {
            $isChanged = $false
            $Lines = $richbox2.Lines | Where {$_}
            
            for($i = 0; $i -lt $richbox2.Lines.Count; $i++) {
                if($Lines[$i] -match "-" -and $Lines[$i] -match "\s|#" ) {
                    $Lines[$i] = $Lines[$i].Trim().split(" #") -match "-"
                    $isChanged = $true
                }
            }
            
            if($isChanged) {
               $richbox2.Lines = $Lines 
            }      
        }
    
    })

    27 декабря 2017 г. 10:35
    Отвечающий
  • Не получается, а что решетка означает?

    -match "\s|#"

    9 января 2018 г. 6:20
  • Не получается, а что решетка означает?

    -match "\s|#"

    \s - Matches any white-space character

    | - Matches any one element separated by the vertical bar (|) character.

    # - # character


    • Изменено KazunEditor 9 января 2018 г. 6:41
    9 января 2018 г. 6:41
    Отвечающий
  • Все же не фильтрует, спасибо за помощь.  Попробую гуглю порыть
    9 января 2018 г. 10:26
  • Самое простое написать свою функцию для фильтрации и нажимать по кнопке. Для базовой фильтрации можно в этом же событии:

    $richbox2.Add_TextChanged({
        $MAX = 5 
    
        if($richbox2.Lines.Length -gt $MAX) {
            $richbox2.Lines = $richbox2.Lines | Where {$_.Trim()} | Select -First $MAX 
        }
        
        if($richbox2.Lines -match "-") {
            $isChanged = $false
            $Lines = $richbox2.Lines | Where {$_}
            
            for($i = 0; $i -lt $richbox2.Lines.Count; $i++) {
                if($Lines[$i] -match "-" -and $Lines[$i] -match "\s|#" ) {
                    $Lines[$i] = $Lines[$i].Trim().split(" #") -match "-"
                    $isChanged = $true
                }
            }
            
            if($isChanged) {
               $richbox2.Lines = $Lines 
            }      
        }
    
    })

    Если я правильно понял фильтрация нужна по дефису, ну как то так, если в этом же событии, но это довольно жестко, лучше наверное через кнопку:

    $richbox2.Add_TextChanged({
        $MAX = 5 
    
        if($richbox2.Lines.Length -gt $MAX) {
            $richbox2.Lines = $richbox2.Lines | Where {$_.Trim()} | Select -First $MAX 
        }
        
    $richbox2.lines = $richbox2.lines.split() | ? {$_ -like '*-*'}
    
    })


    ну я такой прихожу и мур, мур, мур!

    • Помечено в качестве ответа Sel83 12 января 2018 г. 14:54
    12 января 2018 г. 4:58

  • Если я правильно понял фильтрация нужна по дефису, ну как то так, если в этом же событии, но это довольно жестко, лучше наверное через кнопку:

    $richbox2.Add_TextChanged({
        $MAX = 5 
    
        if($richbox2.Lines.Length -gt $MAX) {
            $richbox2.Lines = $richbox2.Lines | Where {$_.Trim()} | Select -First $MAX 
        }
        
    $richbox2.lines = $richbox2.lines.split() | ? {$_ -like '*-*'}
    
    })


    ну я такой прихожу и мур, мур, мур!

    то что нужно! Спасибо огромное, да сделал на кнопку выполнить!!!! СПАСИБО ОГРОМНОЕ!

    • Изменено Sel83 12 января 2018 г. 14:54
    12 января 2018 г. 14:53