如果var更改则更新文本框

时间:2019-06-18 16:06:29

标签: powershell

我想更新WPF PowerShell GUI。我用一个按钮和一个文本框设置了一个小的GUI,以测试我的脚本。看起来像:

[void][System.Reflection.Assembly]::LoadWithPartialName('presentationframework')
Add-Type -AssemblyName System.Windows.Forms

[xml]$XAML = @"
<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="test" Height="630" Width="500" ResizeMode="NoResize" WindowStartupLocation="CenterScreen">
    <Grid>
        <StackPanel>
            <Button Name="test" Content="Button" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75"/>
            <TextBox Name="write" HorizontalAlignment="Left" Height="23" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120"/>
        </StackPanel>
    </Grid>
</Window>
"@

$reader = (New-Object System.Xml.XmlNodeReader $xaml)
try {
    $Form = [Windows.Markup.XamlReader]::Load($reader)
} catch {
    Write-Host "Something is wrong"; exit
}

$xaml.SelectNodes("//*[@Name]") | %{
    Set-Variable -Name ($_.Name) -Value $Form.FindName($_.Name)
}

$test.Add_Click({
    Write-Host $varvar
    Start-Process powershell -Argument ".\varchecker.ps1"
})

$Form.ShowDialog() | Out-Null

通过单击按钮,我启动另一个脚本,在该脚本中读取变量。看起来像:

while ($true) {
    $global:varvar = Get-Content var.txt
    Write-Host $varvar
}

现在,我想将已启动脚本中的var打印到另一个脚本中的文本框中。这可能吗?还是更好的问题:这是个好方法吗?

2 个答案:

答案 0 :(得分:0)

我不认为您可以这样做。您正在尝试启动新的PowerShell进程,获取一些数据并将其传递给父进程。我认为您可以使用pipe()fork()在C语言中完成此操作,但是还没有找到在PowerShell中执行此操作的方法。

但是,您可以使用Start-Job,它会在后台创建一个进程。另外,您也可以查看Runspaces进行多线程处理。

您还可以使用Invoke-Expression来调用脚本。 您只需从脚本中返回$Varvar就可以了。

如果您可以告诉我们您要使用此方法解决的问题,也许人们会更有帮助。

答案 1 :(得分:0)

如果只想读取文件内容,则从GUI内的新PowerShell进程获取值太复杂了。

为什么不从您拥有的GUI代码中全部删除?

# [System.Reflection.Assembly]::LoadWithPartialName is deprecated.
Add-Type -AssemblyName PresentationFramework

[xml]$xaml = @"
<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="test" Height="630" Width="500" ResizeMode="NoResize" WindowStartupLocation="CenterScreen">
    <Grid>
        <StackPanel>
            <Button Name="test" Content="Button" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75"/>
            <TextBox Name="write" HorizontalAlignment="Left" Height="23" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120"/>
        </StackPanel>
    </Grid>
</Window>
"@

$reader = New-Object System.Xml.XmlNodeReader $xaml
try {
    $Form = [Windows.Markup.XamlReader]::Load($reader)
} 
catch {
    Write-Host "Something is wrong"; exit
}

# get references for the button and textbox objects into PowerShell variables.
$button  = $Form.FindName("test")
$textBox = $Form.FindName("write")

$button.Add_Click({
    # don't start a new PowerShell process, but simply read the file here
    $textBox.Text = $var = Get-Content -Path 'PATH TO var.txt' -Raw
    Write-Host $var
})

$Form.ShowDialog() | Out-Null

# clean-up
$reader.Dispose()