Выполнять PowerShell GUI локально, но отправлять вывод по сети - PullRequest
0 голосов
/ 10 февраля 2019

Я использую отличный скрипт Chrome-Kiosk из https://github.com/alex-tomin/Tomin.Tools.KioskMode, и он отлично работает.Я изменил его для наших табло на работе, и мы используем его безупречно с 11 экранами.

Я хотел изменить его, чтобы сделать одно средство запуска экрана, чтобы я мог открыть небольшое окно графического интерфейса, введите URL-адрес длядисплей, а затем номер экрана, на котором он должен отображаться.Я создал небольшой скрипт, и он отлично работает на моей локальной машине.То, что я хочу сделать, это открыть графический интерфейс на моем экране, а затем отправить две переменные по сети на дисплейный компьютер в сети.Я надеялся, что смогу сделать это с помощью удаленного выполнения, как показано здесь: https://www.howtogeek.com/117192/how-to-run-powershell-commands-on-remote-computers/,, но не повезло.

Вот код GUI:

function button ($title,$mailbx, $WF, $TF) {
    [void][System.Reflection.Assembly]::LoadWithPartialName( "System.Windows.Forms")
    [void][System.Reflection.Assembly]::LoadWithPartialName( "Microsoft.VisualBasic")

    $form = New-Object "System.Windows.Forms.Form";
    $form.Width = 500;
    $form.Height = 150;
    $form.Text = $title;
    $form.StartPosition = [System.Windows.Forms.FormStartPosition]::CenterScreen;

    $textLabel1 = New-Object "System.Windows.Forms.Label";
    $textLabel1.Left = 25;
    $textLabel1.Top = 15;
    $textLabel1.Text = $mailbx;

    $textLabel2 = New-Object "System.Windows.Forms.Label";
    $textLabel2.Left = 25;
    $textLabel2.Top = 50;
    $textLabel2.Text = $WF;

    $textBox1 = New-Object "System.Windows.Forms.TextBox";
    $textBox1.Left = 150;
    $textBox1.Top = 10;
    $textBox1.width = 200;

    $textBox2 = New-Object "System.Windows.Forms.TextBox";
    $textBox2.Left = 150;
    $textBox2.Top = 50;
    $textBox2.width = 200;

    $defaultValue = ""
    $textBox1.Text = $defaultValue;
    $textBox2.Text = $defaultValue;

    $button = New-Object "System.Windows.Forms.Button";
    $button.Left = 360;
    $button.Top = 85;
    $button.Width = 100;
    $button.Text = "Ok";

    $eventHandler = [System.EventHandler]{
        $textBox1.Text;
        $textBox2.Text;
        $form.Close();
    };

    $button.Add_Click($eventHandler) ;

    # Add controls to all the above objects defined
    $form.Controls.Add($button);
    $form.Controls.Add($textLabel1);
    $form.Controls.Add($textLabel2);
    $form.Controls.Add($textLabel3);
    $form.Controls.Add($textBox1);
    $form.Controls.Add($textBox2);
    $form.Controls.Add($textBox3);
    $ret = $form.ShowDialog();

    return $textBox1.Text, $textBox2.Text#, $textBox3.Text
}

$return= button "Monitoring Screen Selector" "Enter URL" "Enter Screen # from 1 to 11" #"Target Folder"
$return[0]
$return[1]

Первая часть скрипта - это GUI, он передает $return[0] и $return[1] во вторую часть скрипта, которая ниже:

$chromePath = 'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe'
$chromeArguments = '--new-window'

# if Window not moved (especially on machine start) - try increasing the delay. 
$ChromeStartDelay = 3

Set-Location $PSScriptRoot
. .\HelperFunctions.ps1

# Kill all running instances
# &taskkill /im chrome* /F

Chrome-Kiosk $return[0] -MonitorNum $return[1]

Таким образом, GUI должен открыться на локальном ПК, а затем отправить$return[0] и $return[1] к компьютеру со всеми подключенными к нему дисплеями, чтобы вторая часть сценария могла получить эти два ввода из графического интерфейса, а затем активировать экран и URL-адрес.

Идея заключается в том, что во время инцидента или события, которое не покрывается нашими обычными экранами, мы можем перебросить туда веб-страницу до тех пор, пока она не будет решена, а затем закрыть ее вручную (если кто-то не знает, как ее перехватить).PID конкретного экземпляра Chrome, в котором я очень сильно сомневаюсь, чтобы его можно было как-то прекратить)

Есть какие-нибудь подсказки, как мне это сделать?

1 Ответ

0 голосов
/ 10 марта 2019

Хорошо, вот что я сделал, чтобы сделать эту работу.Я создал серверные сценарии, которые проверяют папку на наличие двух конкретных файлов, и, как только он их видит, он отправляет эти данные в основной сценарий, который ожидает номер монитора и URL-адрес.Надеюсь, кто-нибудь найдет это полезным.

Вам нужно будет пойти и загрузить оригинальный Chrome-Kiosk из https://alextomin.wordpress.com/2015/04/10/kiosk-mode-in-windows-chrome-on-multiple-displays/

СЕРВЕРНЫЕ СКРИПТЫ

Я положил их в папку с именемc: \ scripts \ ICVT

looper.PS1 - Это будет выполняться постоянно

Set-Location -Path C:\scripts\ICVT
   while ($true) {
   .\file_checker.ps1;
   }

file_checker.PS1 - Это сценарий, который запускается петлителем.file_checker сканирует папку для web.txt и mon.txt.Оба должны присутствовать для выполнения остальной части сценария.

#Checks folder for web.txt and mon.txt . Both must be present for the rest of the 
script to execute
Set-Location -Path C:\scripts\ICVT
$a = Test-Path web.txt
$b = Test-Path mon.txt
IF (($a -and $b -eq $True)) {
.\launcher.ps1
} 
else {
Write-Host "Scanning For Files"
} 
Start-Sleep -Seconds 5

launcher.PS1 - Это всего лишь измененная версия исходного сценария

    $chromePath = 'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe'
    $chromeArguments = '--new-window'
    $web = (Get-Content -Path web.txt)
    $mon = (Get-Content -Path mon.txt)

    # if Window not moved (especially on machine start) - try increasing the delay. 
    $ChromeStartDelay = 5

    Set-Location $PSScriptRoot
    . .\HelperFunctions.ps1

    Chrome-Kiosk $web -MonitorNum $mon

    #Delete parameters after use
    Start-Sleep -Seconds 5
    del web.txt
    del mon.txt

СТОРОНА КЛИЕНТА

menu.PS1 - Если вы хотите перенести определенный экран на компьютер с дисплеем по сети, то настройте Network Path, но если вы подключены к локальному ПК, то Local Local - это тот, который нужно настроить.Пока Looper может видеть папку, она будет работать.В меню есть небольшая логика, поэтому скрипт не будет выполняться, если вы закроете окно, не вводя никаких подробностей.(если вы запускаете модуль запуска без параметров, он все равно выполняет Chrome и отправляет его на экран, который по какой-то причине выходит за пределы массива, обычно номер 2)

#################Local Path###################
Set-Location -Path c:\scripts\ICVT

#################Network Path#################
#Set-Location -Path \\somecomputer\c$\scripts\ICVT



function button ($title,$mailbx, $WF, $TF) {

###################Load Assembly for creating form & button######

[void][System.Reflection.Assembly]::LoadWithPartialName( “System.Windows.Forms”)
[void][System.Reflection.Assembly]::LoadWithPartialName( “Microsoft.VisualBasic”)

#####Define the form size & placement

$form = New-Object “System.Windows.Forms.Form”;
$form.Width = 500;
$form.Height = 150;
$form.Text = $title;
$form.StartPosition = [System.Windows.Forms.FormStartPosition]::CenterScreen;

##############Define text label1
$textLabel1 = New-Object “System.Windows.Forms.Label”;
$textLabel1.Left = 25;
$textLabel1.Top = 15;

$textLabel1.Text = $mailbx;

##############Define text label2

$textLabel2 = New-Object “System.Windows.Forms.Label”;
$textLabel2.Left = 25;
$textLabel2.Top = 50;

$textLabel2.Text = $WF;

##############Define text label3

#$textLabel3 = New-Object “System.Windows.Forms.Label”;
#$textLabel3.Left = 25;
#$textLabel3.Top = 85;

#$textLabel3.Text = $TF;

############Define text box1 for input
$textBox1 = New-Object “System.Windows.Forms.TextBox”;
$textBox1.Left = 150;
$textBox1.Top = 10;
$textBox1.width = 200;

############Define text box2 for input

$textBox2 = New-Object “System.Windows.Forms.TextBox”;
$textBox2.Left = 150;
$textBox2.Top = 50;
$textBox2.width = 200;

############Define text box3 for input

#$textBox3 = New-Object “System.Windows.Forms.TextBox”;
#$textBox3.Left = 150;
#$textBox3.Top = 90;
#$textBox3.width = 200;

#############Define default values for the input boxes
$defaultValue = “”
$textBox1.Text = $defaultValue;
$textBox2.Text = $defaultValue;
#$textBox3.Text = $defaultValue;

#############define OK button
$button = New-Object “System.Windows.Forms.Button”;
$button.Left = 360;
$button.Top = 85;
$button.Width = 100;
$button.Text = “Ok”;

############# This is when you have to close the form after getting values
$eventHandler = [System.EventHandler]{
$textBox1.Text;
$textBox2.Text;
#$textBox3.Text;
$form.Close();};

$button.Add_Click($eventHandler) ;

#############Add controls to all the above objects defined
$form.Controls.Add($button);
$form.Controls.Add($textLabel1);
$form.Controls.Add($textLabel2);
$form.Controls.Add($textLabel3);
$form.Controls.Add($textBox1);
$form.Controls.Add($textBox2);
$form.Controls.Add($textBox3);
$ret = $form.ShowDialog();

#################return values

return $textBox1.Text, $textBox2.Text#, $textBox3.Text
}

$return= button “Monitoring Screen Selector” “Enter URL” “Enter Screen # from 1 to 11” #“Target Folder”

if ($return[0] -ne "") {
$return[0] > web.txt
}

if ($return[0] -eq "") {
exit
}

if ($return[1] -ne "") {
$return[1] > mon.txt
}


if ($return[0] -eq "") {
exit
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...