Обновить текстовое поле, если var изменяется - PullRequest
0 голосов
/ 18 июня 2019

Я хочу обновить мой WPF PowerShell 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
}

Теперь я хочу напечатать переменную из запущенного скрипта в текстовое поле другого скрипта.Это возможно?Или лучший вопрос: это хороший способ сделать это?

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

Получение значений из нового процесса 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()
0 голосов
/ 18 июня 2019

Я не думаю, что вы можете сделать это таким образом.Вы пытаетесь запустить новый процесс PowerShell, получить некоторые данные и передать их родительскому процессу.Я думаю, что вы можете сделать это в C с pipe() и fork(), но еще не нашли способ сделать это в PowerShell.

Однако вы можете использовать Start-Job, который создает процесс вфон.В качестве альтернативы вы также можете посмотреть на Runspaces для многопоточности.

Вы также можете использовать Invoke-Expression для вызова скрипта.Все, что вам нужно сделать из сценария, это вернуть $Varvar.

Если вы можете сказать нам, какую проблему вы пытаетесь решить с помощью этого метода, возможно, люди могут быть более полезными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...