我想更新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打印到另一个脚本中的文本框中。这可能吗?还是更好的问题:这是个好方法吗?
答案 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()