2017-10-06 45 views
1

我有一个接受大量参数且相当大的脚本。我被要求构建一个用于执行脚本的GUI,以便用户可以轻松地执行脚本而不会犯错。所以想法是GUI脚本收集所有参数,然后执行脚本。在wpf事件脚本中执行脚本时的写入输出

“主”脚本使用write-outputstart-transcript来登录到shell和文件。这也适用。 但是,当我从GUI脚本执行脚本时,我没有获得每个输出到shell或日志。我认为这是因为write-output,因为Write-Host确实有用,但我到处都听到有人说你不应该使用write-host(例如:https://youtu.be/SSJot1ycM70?t=24m1s)。 那么我如何得到这个工作?

目前我使用这个从GUI执行脚本:

& $PSscriptroot\guitest2.ps1 -switchparam1:$localvar1 -switchparam2:$localvar2 -stringparam $localvar3 

我试图通过CMD运行的PowerShell的新实例,但我似乎并没有得到这个工作。我也不知道如何以这种方式将参数“发送”到脚本中。

Invoke-Expression 'cmd /c powershell.exe -file C:\...\script.ps1 -paramters. 

Invoke-Expression 'cmd /c powershell.exe -command {C:\..\script.ps1 -paramters..} 

下面的两个脚本做我想做什么。但是当我在wpf事件中执行脚本时(即按下启动按钮后),第二个脚本仅显示write-warning,write-errorwrite-host输出,所以不是write-output

SCRIPT1:

#gui script 

$boolean = $true 
$string = "test" 

& $PSscriptroot\script2.ps1 -switch:$boolean -string $string 

SCRIPT2:

param(
    [switch]$switch, 
    [string]$string 
    ) 

Start-Transcript 

write-output "output" 
write-host "host" 
$a = "Variable" 
$a 

write-error "error" 
Write-Warning "warning" 
Write-Debug "debug" 

Stop-Transcript 

编辑: 做了一些更多的测试。当在wpf事件中调用时,显然write-output完全不起作用。例如:如果

$wpf.startButton.Add_Click({ 
    write-output "This message is not shown" 
}) 

不知道这是一个错误或不

+1

你可以把这下降到[mcve]吗?很难调试我们看不到的代码。脚本如何输出结果?即使您没有写出cmdlet,也可以在后台使用“Write-Output”。 – Matt

+0

你说得对。我添加了两个** ** **的示例脚本。但是当我在wpf事件中运行脚本1的最后一行时(在按下启动按钮之后),我没有将所有输出回到我的shell/log –

回答

0

Write-Output通过管道向另一个命令的对象。本质上,声明

Write-Output <expression> 

在许多情况下完全相同

<expression> 

其他Write-* cmdlet的行为有些不同。在你的情况下,你有一个事件处理程序,无论如何都没有返回值。你举的例子是一样的

"This message is not shown" 

甚至

return "This message is not shown" 

由于字符串是脚本块的返回值,这从来没有人看的部分。

如果要在主机应用程序中输出,请使用Write-Host。这就是它的目的。 Write-Output是你很少,如果有的话,需要在脚本中。

相关问题