Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Передача переменных в функцию

Ответить
Настройки темы
PowerShell - Передача переменных в функцию

Старожил


Сообщения: 232
Благодарности: 21

Профиль | Отправить PM | Цитировать


Изменения
Автор: Uragan66
Дата: 17-12-2019
Описание: опечатка
Добрый вечер всем!
Подскажите, пожалуйста, как правильно передать переменные в функцию.
На WinForm расположены две радиокнопки. По активации каждой из них должен выполняться один и тот же скриптблок, но с разными переменными.
Скриптблок обернул в функцию, в параметрах указываю эти переменные, но с условий активации радиокнопок они не передаются.
Код: Выделить весь код
    function GenerateForm {

        [reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null
        [reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null

        $form1 = New-Object System.Windows.Forms.Form
        $button1 = New-Object System.Windows.Forms.Button
        $listBox1 = New-Object System.Windows.Forms.ListBox
        $RadioButton = New-Object System.Windows.Forms.RadioButton
        $RadioButton1 = New-Object System.Windows.Forms.RadioButton
        $InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState

        $b1= $false
        $b2= $false
        $b3= $false

#----------------------------------------------
#Generated Event Script Blocks
#----------------------------------------------
        function online ($url, $name) {
            $watch = [System.Diagnostics.Stopwatch]::StartNew()
            $watch.Start() #Запуск таймера
            
            $file = New-TemporaryFile
            $lfile = New-TemporaryFile
            $d = '#EXTM3U'
            (Invoke-WebRequest -UseBasicParsing -Uri $url -TimeoutSec 20).Links.Href | Where {$_ -match "html"} | Sort-Object -Unique `
            | ForEach {$_ -replace "(.*html)","$url`$1"} | Out-File $file.FullName
            $ls = Get-Content $file.FullName -Encoding utf8
            ForEach ($link in $ls){
                $a = Invoke-WebRequest -Uri $link -TimeoutSec 20 -Method GET
                if ($a.Content -match '<h1>') {
                    $a.Content -match '<h1>(.*) смотреть онлайн</h1>' | Out-Null
                    $matches[1] | ForEach-Object {[Void]$listbox1.Items.Add($_)}
                    $listBox1.SelectedIndex = $listBox1.Items.Count -1
                    $listBox1.SelectedIndex = -1
                    $n = '#EXTINF:-1,'+$matches[1]
                    if ($a -notmatch "iframe.*https?.*html") {
                        $a.Content -match 'iframe.*"(https?.+php)".*' | Out-Null
                        $Global:l = $matches[1]
                        if ($l -notmatch "youtube") {
                            (Invoke-WebRequest -UseBasicParsing -URI $l -Headers @{"Referer"=$link}).Content -match 'file:"([^"]+)"' | Out-Null
                            $m = $matches[1]
                            Add-Content $lfile.FullName -Encoding utf8 -Value $n,$m
                        }
                        else {
                            continue
                        }
                    }
                    else {
                        $a.Content -match 'iframe.*"(https?.+html)".*' | Out-Null
                        $Global:l = $matches[1]
                        (Invoke-WebRequest -UseBasicParsing -URI $l -Headers @{"Referer"=$link}).Content -match 'var videoLink.*(https?[^"]+m3u8)' | Out-Null
                        $m = $matches[1]
                        Add-Content $lfile.FullName -Encoding utf8 -Value $n,$m
                    }
                }
                else {
                    continue
                }
            }
            $c = Get-Content $lfile.FullName -Encoding utf8
            Set-Content $name -Encoding utf8 -value $d,$c
            Remove-Item $file.FullName -errorAction silentlycontinue
            Remove-Item $lfile.FullName -errorAction silentlycontinue
            $listBox1.Items.Add("Плейлист создан!")
            $listBox1.SelectedIndex = $listBox1.Items.Count -1
            $listBox1.SelectedIndex = -1                

            $watch.Stop() #Остановка таймера
            $watch.Elapsed #Время выполнения     
            
            $time = $watch.Elapsed

        }
        
        $handler_button1_Click= 
        {
            $listBox1.Items.Clear();    

            if ($RadioButton.Checked) {

                $url = 'http://первый сайт'
                $name = '.\первый.txt'
                online
            }
            
            elseif ($RadioButton1.Checked) {

                $url = 'http://второй сайт'
                $name = '.\второй.txt'
                online
            }
            
            if ( !$RadioButton.Checked -and !$RadioButton1.Checked ) {   $listBox1.Items.Add("No CheckBox selected....")} 
        }


        $OnLoadForm_StateCorrection=
        {#Correct the initial state of the form to prevent the .Net maximized form issue
            $form1.WindowState = $InitialFormWindowState
        }

#----------------------------------------------
#region Generated Form Code
        $form1.Text = "TV"
        $form1.Name = "form1"
        $form1.DataBindings.DefaultDataSourceUpdateMode = 0     
        $form1.FormBorderStyle = [System.Windows.Forms.FormBorderStyle]::FixedSingle
        $form1.StartPosition = [System.Windows.Forms.FormStartPosition]::CenterScreen
        $System_Drawing_Size = New-Object System.Drawing.Size
        $System_Drawing_Size.Width = 450
        $System_Drawing_Size.Height = 660
        $form1.BackColor = "0x7AC5E7"
        $form1.Opacity = 0.96
        $form1.Icon = New-Object System.Drawing.Icon(".\favicon.ico")
        $form1.ClientSize = $System_Drawing_Size

        $button1.TabIndex = 1
        $button1.Name = "button1"
        $System_Drawing_Size = New-Object System.Drawing.Size
        $System_Drawing_Size.Width = 75
        $System_Drawing_Size.Height = 23
        $button1.Size = $System_Drawing_Size
        $button1.UseVisualStyleBackColor = $True

        $button1.Text = "Run Script"

        $System_Drawing_Point = New-Object System.Drawing.Point
        $System_Drawing_Point.X = 25
        $System_Drawing_Point.Y = 585
        $button1.Location = $System_Drawing_Point
        $button1.DataBindings.DefaultDataSourceUpdateMode = 0
        $button1.add_Click($handler_button1_Click)

        $form1.Controls.Add($button1)

        $CancelButton = New-Object System.Windows.Forms.Button
        $CancelButton.Location = New-Object System.Drawing.Point(25,615)
        $CancelButton.Size = New-Object System.Drawing.Size(75,23)
        $CancelButton.Text = "Cancel"
        $CancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
        $CancelButton.UseVisualStyleBackColor = $True
        $button1.TabIndex = 2
        $form1.CancelButton = $CancelButton
        $form1.Controls.Add($CancelButton)

        $listBox1.FormattingEnabled = $True
        $System_Drawing_Size = New-Object System.Drawing.Size
        $System_Drawing_Size.Width = 210
        $System_Drawing_Size.Height = 640
        $listBox1.Size = $System_Drawing_Size
        $listBox1.DataBindings.DefaultDataSourceUpdateMode = 0
        $listBox1.Name = "listBox1"
        $System_Drawing_Point = New-Object System.Drawing.Point
        $System_Drawing_Point.X = 220
        $System_Drawing_Point.Y = 13
        $listBox1.Location = $System_Drawing_Point
        $listBox1.TabIndex = 3

        $form1.Controls.Add($listBox1)

        $RadioButton.UseVisualStyleBackColor = $True
        $RadioButton.Checked = $false
        $System_Drawing_Size = New-Object System.Drawing.Size
        $System_Drawing_Size.Width = 154
        $System_Drawing_Size.Height = 30
        $RadioButton.Size = $System_Drawing_Size
        $RadioButton.TabIndex = 4
        $RadioButton.Text = "TV1"
        $System_Drawing_Point = New-Object System.Drawing.Point
        $System_Drawing_Point.X = 25
        $System_Drawing_Point.Y = 40
        $RadioButton.Location = $System_Drawing_Point
        $RadioButton.DataBindings.DefaultDataSourceUpdateMode = 0
        $RadioButton.Name = "RadioButton"
        $RadioButton.add_CheckedChanged({
            if ($RadioButton.Checked){
                $listBox1.Items.Add( "TV1"  )
            }
            else {
                $listBox1.Items.Clear();   
            }
        })

        $form1.Controls.Add($RadioButton)

        $RadioButton1.UseVisualStyleBackColor = $True
        $RadioButton1.Checked = $false
        $System_Drawing_Size = New-Object System.Drawing.Size
        $System_Drawing_Size.Width = 154
        $System_Drawing_Size.Height = 30
        $RadioButton1.Size = $System_Drawing_Size
        $RadioButton1.TabIndex = 5
        $RadioButton1.Text = "TV2"
        $System_Drawing_Point = New-Object System.Drawing.Point
        $System_Drawing_Point.X = 25
        $System_Drawing_Point.Y = 75
        $RadioButton1.Location = $System_Drawing_Point
        $RadioButton1.DataBindings.DefaultDataSourceUpdateMode = 0
        $RadioButton1.Name = "RadioButton1"
        $RadioButton1.add_CheckedChanged({
            if ($RadioButton1.Checked){
                $listBox1.Items.Add( "TV2"  )
            }
            else {
                $listBox1.Items.Clear();   
            }
        })

        $form1.Controls.Add($RadioButton1)


#Save the initial state of the form
        $InitialFormWindowState = $form1.WindowState
#Init the OnLoad event to correct the initial state of the form
        $form1.add_Load($OnLoadForm_StateCorrection)
#Show the Form
        $form1.ShowDialog()| Out-Null

    } #End Function

#Call the Function
    GenerateForm
Почему не передаются переменный в функцию, что неправильно ?
Заранее благодарен за советы и помощь!

Отправлено: 18:27, 17-12-2019

 

Старожил


Сообщения: 232
Благодарности: 21

Профиль | Отправить PM | Цитировать


Разобрался сам. Переменные я то объявил, а в функцию их не передал:
Код: Выделить весь код
			if ($RadioButton.Checked) {
				online -url 'http://первый сайт' -name '.\первый.txt'
			}
			
			elseif ($RadioButton1.Checked) {
				online -url 'http://второй сайт' -name '.\второй.txt'
			}

Отправлено: 21:08, 17-12-2019 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Старожил


Сообщения: 232
Благодарности: 21

Профиль | Отправить PM | Цитировать


Но осталась одна нерешенная проблема, может кто подскажет, буду премного благодарен.
Пока не запущен скрипт блок внутри EventHandler, с окном формы можно делать всё (сворачивать в панель задач, разворачивать и т.д.). Но, после запуска скриптблока, окно становится неуправляемым, его нельзя ни свернуть, ни передвинуть.
Можно ли решить эту проблему, с чем это связано ?

Отправлено: 22:16, 17-12-2019 | #3


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


Цитата Uragan66:
Можно ли решить эту проблему, »
Какую именно? Что Вы считаете проблемой — то, что до, или то, что после?

Отправлено: 03:02, 18-12-2019 | #4


Старожил


Сообщения: 232
Благодарности: 21

Профиль | Отправить PM | Цитировать


Iska, то что, после запуска скриптблока, окно делается неподвижным, это, в некотором роде проблема, бывает нужно свернуть его.

Отправлено: 08:57, 18-12-2019 | #5


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


Возможно, правильный ответ — «…create a Background Task» (winforms - Why is my WindowsForm not responding while executing loop - Stack Overflow, там же разъяснения, почему оно становится freeze).
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:36, 18-12-2019 | #6


Старожил


Сообщения: 232
Благодарности: 21

Профиль | Отправить PM | Цитировать


Iska, спасибо!
Наверное так и оставлю, не так то и велика проблема. Переписывать весь код для запуска через Start-Job как-то неохота, слишком много работы, да и может не получиться...

Отправлено: 20:04, 18-12-2019 | #7


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


Uragan66, сделайте в форме строку состояния и выводите в неё перед началом обработки что-нибудь типа «Ожидайте, идёт обработка…».
Это сообщение посчитали полезным следующие участники:

Отправлено: 20:42, 18-12-2019 | #8


Старожил


Сообщения: 232
Благодарности: 21

Профиль | Отправить PM | Цитировать


Цитата Iska:
сделайте в форме строку состояния »
У меня на форме listbox есть, можно в него сообщение вывести. Но утилита так для частного пользования (себе да знакомым), так что особой нужды в предупреждении нет...
Да и, непонятно почему, не всегда процесс формы занят циклом, во время работы оного. Бывает что можно и свернуть в панель задач.

Отправлено: 21:04, 18-12-2019 | #9


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


Цитата Uragan66:
У меня на форме listbox есть, можно в него сообщение вывести. »
Не, лучше в строку состояния (тем паче, что в .Net есть готовый родной элемент управления для того, не надо делать никаких специальных приседаний для того).
Это сообщение посчитали полезным следующие участники:

Отправлено: 22:33, 18-12-2019 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Передача переменных в функцию

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
VBS/WSH/JS - передача переменных bat>vbs Imago_ Скриптовые языки администрирования Windows 2 23-06-2015 18:50
C/C++ - Передача объекта (матрици в функцию) _Goodwin Программирование и базы данных 4 25-10-2013 03:02
VBS/WHS/JS - Передача объекта в функцию ven00m Программирование и базы данных 3 17-07-2008 16:13
JavaScript: Передача переменных Crowner Вебмастеру 10 03-08-2005 09:52
PHP и передача значений переменных... Guest Вебмастеру 3 13-04-2004 14:01




 
Переход