在本地执行PowerShell GUI,但通过网络发送输出

时间:2019-02-10 11:35:45

标签: windows powershell user-interface scripting

我正在使用https://github.com/alex-tomin/Tomin.Tools.KioskMode中出色的Chrome-Kiosk脚本,它运行良好。我已经为工作中的显示板进行了修改,并且可以在11个屏幕上完美使用它。

我想对其进行修改以使其成为单个屏幕启动器,所以我可以打开一个小GUI框,输入要显示的URL,然后输入显示的屏幕编号。我创建了一个小脚本,它可以在本地计算机上完美运行。我要做的是打开屏幕上的GUI,然后通过网络将这两个变量发送到网络上的显示PC。我希望我能够通过远程执行此操作,如以下所示: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应该在本地PC上打开,然后将$return[0]$return[1]发送到计算机,同时将所有显示器插入其中,以便脚本的第二部分可以接收这两个输入从GUI,然后激活屏幕和URL。

这样的想法是,在正常屏幕无法覆盖的事件或事件中,我们可以在该页面上放一个网页,直到问题解决为止,然后再手动关闭它(除非有人知道如何捕获一个特定的Chrome实例,我对此非常怀疑,以便可以通过某种方式终止它)

关于我该怎么做的任何提示?

1 个答案:

答案 0 :(得分:0)

好的,这就是我要做的工作。我创建了服务器端脚本,该脚本检查一个文件夹中是否包含2个特定文件,一旦看到它们,它将把该数据发送到需要监视号和URL的主脚本中。希望有人觉得这有用。

您需要从https://alextomin.wordpress.com/2015/04/10/kiosk-mode-in-windows-chrome-on-multiple-displays/

下载原始的Chrome-Kiosk

服务器脚本

我已将它们放入名为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

客户侧

菜单PS1-如果要通过网络将特定屏幕推送到显示计算机,请设置“网络路径”,但是如果连接到本地PC,则需要设置“本地路径”。只要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
}