繁体   English   中英

使用PowerGUI将ps1转换为exe时出现问题

[英]Problems converting ps1 to exe using PowerGUI

我正在尝试将PowerShell项目转换为可执行程序(.exe)。 经过一番研究,我发现了PowerGUI。 将我的.ps1文件转换为exe后,我遇到了一些问题:

首先 ,启动该程序需要花费一些时间(大约15秒),这是正常现象还是我可以采取一些措施来改善这一状况?

其次 ,如果我退出程序,则会收到Windows错误消息,提示程序意外停止工作。 有没有办法隐藏此消息?

这是我的ps1代码,我从博客中获得了一部分,这是我的第一个PowerShell代码,因此请不要对我苛刻;)

 $inputXML = @"
<Window x:Class="BlogPostIII.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:BlogPostIII"
        mc:Ignorable="d"
        Title="Organizer" Height="540" Width="540" FontSize="18.667">
    <Grid x:Name="background">
        <Button x:Name="OK" Content="OK" HorizontalAlignment="Left" Height="41" Margin="420,458,0,0" VerticalAlignment="Top" Width="100" FontSize="18.667"/>
        <Button x:Name="Cancel" Content="Cancel" HorizontalAlignment="Left" Height="41" Margin="315,458,0,0" VerticalAlignment="Top" Width="100" FontSize="18.667"/>
        <TextBox x:Name="TextBox1" HorizontalAlignment="Left" Height="30" Margin="108,216,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="300" FontSize="18.667"/>
        <TextBlock x:Name="TextBlock1" HorizontalAlignment="Left" Height="30" Margin="108,36,0,0" TextWrapping="Wrap" Text="Soort bewerking:" VerticalAlignment="Top" Width="300" FontSize="18.667"/>
        <TextBox x:Name="TextBox2" HorizontalAlignment="Left" Height="30" Margin="108,291,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="300" FontSize="18.667"/>
        <TextBlock x:Name="TextBlock2" HorizontalAlignment="Left" Height="30" Margin="108,111,0,0" TextWrapping="Wrap" Text="Naam Machine:" VerticalAlignment="Top" Width="300" FontSize="18.667"/>
        <TextBox x:Name="TextBox3" HorizontalAlignment="Left" Height="30" Margin="108,366,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="300" FontSize="18.667"/>
        <TextBlock x:Name="TextBlock3" HorizontalAlignment="Left" Height="30" Margin="108,185,0,0" TextWrapping="Wrap" Text="Naam van opdrachtgevend bedrijf:" VerticalAlignment="Top" Width="300" FontSize="18.667"/>
        <TextBlock x:Name="TextBlock4" HorizontalAlignment="Left" Height="30" Margin="108,261,0,0" TextWrapping="Wrap" Text="Naam product:" VerticalAlignment="Top" Width="300" FontSize="18.667"/>
        <TextBlock x:Name="TextBlock5" HorizontalAlignment="Left" Height="30" Margin="108,336,0,0" TextWrapping="Wrap" Text="Product ID:" VerticalAlignment="Top" Width="300" FontSize="18.667"/>
        <ComboBox x:Name="combobox1" HorizontalAlignment="Left" Margin="108,66,0,0" VerticalAlignment="Top" Width="300"/>
        <ComboBox x:Name="combobox2" HorizontalAlignment="Left" Margin="108,140,0,0" VerticalAlignment="Top" Width="300"/>
    </Grid>
</Window>
"@        

$inputXML = $inputXML -replace 'mc:Ignorable="d"','' -replace "x:N",'N'  -replace '^<Win.*', '<Window'


[void][System.Reflection.Assembly]::LoadWithPartialName('presentationframework')
[xml]$XAML = $inputXML
#Read XAML

    $reader=(New-Object System.Xml.XmlNodeReader $xaml) 
  try{$Form=[Windows.Markup.XamlReader]::Load( $reader )}
catch{Write-Host "Unable to load Windows.Markup.XamlReader. Double-check syntax and ensure .net is installed."}

#===========================================================================
# Store Form Objects In PowerShell
#===========================================================================

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

Function Get-FormVariables{
if ($global:ReadmeDisplay -ne $true){Write-host "If you need to reference this display again, run Get-FormVariables" -ForegroundColor Yellow;$global:ReadmeDisplay=$true}
write-host "Found the following interactable elements from our form" -ForegroundColor Cyan
get-variable WPF*
}

Get-FormVariables

#===========================================================================
# List the Comboboxes
#===========================================================================

$WPFcombobox1.AddText('Draaien')
$WPFcombobox1.AddText('Frezen')
$WPFcombobox1.AddText('Slijpen')

$WPFcombobox2.AddText('Doosan 3100LM')
$WPFcombobox2.AddText('Doosan 123')
$WPFcombobox2.AddText('machine 3')
$WPFcombobox2.AddText('machine 4')
$WPFcombobox2.AddText('machine 5')


#===========================================================================
# Actually make the objects work
#===========================================================================


#$WPFMakeUserbutton.Add_Click({(Get-FormFields)})


$WPFOK.Add_Click({
    $1 = $WPFcomboBox1.Text
    $2 = $WPFcomboBox2.Text
    $3 = $WPFtextBox1.Text
    $4 = $WPFtextBox2.Text
    $5 = $WPFtextBox3.Text + " Werkblad"
    New-Item C:\Users\Bjorn\Documents\Powershell\$1\$2\$3\$4\ -Force -type directory
    Copy-Item C:\Users\Bjorn\Documents\Powershell\Test_werkblad.docx C:\Users\Bjorn\Documents\Powershell\$1\$2\$3\$4\
    Rename-Item C:\Users\Bjorn\Documents\Powershell\$1\$2\$3\$4\Test_werkblad.docx C:\Users\Bjorn\Documents\Powershell\$1\$2\$3\$4\$5.docx
    Invoke-Item C:\Users\Bjorn\Documents\Powershell\$1\$2\$3\$4
    Invoke-Item C:\Users\Bjorn\Documents\Powershell\$1\$2\$3\$4\$5.docx
    $Form.Close()})

$WPFCancel.Add_Click({
    $Form.Close()})


#===========================================================================
# Shows the form
#===========================================================================
write-host "To show the form, run the following" -ForegroundColor Cyan

function Show-Form{
$Form.ShowDialog() | out-null

}

Show-Form

大约15秒钟,我不确定为什么。 您能提供更多细节吗? 您应该添加日志记录,并在每条消息中添加时间戳...这样,您应该可以找到速度较慢的部分。

为了避免出现该错误消息 ,您应该在代码周围加上try / catch 例如:

    [...]

    write-host "To show the form, run the following" -ForegroundColor Cyan

    function Show-Form
    {
     $Form.ShowDialog() | out-null
    }

    try
    {
     Show-Form
    }
    catch
    {
     $ErrorMessage = $_.Exception.Message
     # Show friendly message with error and/or log the error)
    }

阅读完您的代码后,这里有一些可能有用的额外建议

  • 不要硬编码路径。 (例如“ C:\\ Users \\ Bjorn \\ Documents \\ Powershell \\”)
  • 您真的需要PowerShell吗? 听起来像C#WinForms会更好地完成此任务。
  • 将XML存储在文件中并读取它,而不是将其包含在$ inputXML变量的代码中。

15秒的暂停是PowerShell在后台初始化。 这在Windows 7上尤其明显

CAVEAT:在大多数情况下(包括PowerGUI)将PowerShell编译为EXE会将您的原始PS1文件填充到自解压EXE中。 您可以使用7-Zip或WinZip进行相同的操作。

PowerGUI“已编译” EXE将您的脚本执行锁定为您在DEV框中拥有的任何版本或PowerShell + .Net。 IOW:如果您在使用PowerShell v4的PC上进行编译,但仅在脚本中使用Write-host(例如),则目标PC将需要PowerShell v4 +才能运行!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM