【发布时间】:2016-09-08 10:07:58
【问题描述】:
如果此 PowerShell 脚本调用的批处理脚本引发错误,我将无法停止 PowerShell 脚本。
蝙蝠 1:
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& '%PowerShellScriptPath%\CallInstall.ps1'";
CallInstall.ps1 调用少量批处理文件和 vbs 文件,如果先决条件失败,bat2 会调用基于 vbs 的消息框以显示错误。理想情况下,此时执行应该停止,bat1 应该开始剩余的进程,但在我的情况下,CallInstall.ps1 在返回 bat1 之前仍然执行所有批处理和 vbs 脚本。
CallInstall.ps1:
[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") | Out-Null
Set-Location $PSScriptRoot
$ScriptsHome = Get-Item '.\ScriptInstall\*'
#Define Form
$Form = New-Object System.Windows.Forms.Form
$Form.width = 1000
$Form.height = 200
$Form.Text = "** Installation in Progress**"
$Form.Font = New-Object System.Drawing.Font("Times New Roman" ,12, [System.Drawing.FontStyle]::Regular)
$Form.MinimizeBox = $False
$Form.MaximizeBox = $False
$Form.WindowState = "Normal"
$Form.StartPosition = "CenterScreen"
$Form.Opacity = .8
$Form.BackColor = "Gray"
# Init ProgressBar
$ProgressBar = New-Object System.Windows.Forms.ProgressBar
$ProgressBar.Maximum = $ScriptsHome.Count
$ProgressBar.Minimum = 0
$ProgressBar.Location = new-object System.Drawing.Size(10,70)
$ProgressBar.size = new-object System.Drawing.Size(967,10)
$Form.Controls.Add($ProgressBar)
#$Form.Controls.Add($MessagesLabel)
#Running Script Name
#$Label = New-Object System.Windows.Forms.Label
#$Label.AutoSize = $true
#$Label.Location = New-Object System.Drawing.Point(10,50)
#$Form.Controls.Add($Label)
#Define Array messages
#Array
$Messages = @("Message 1",
"Message 2",
"Message 3",
"Message 4",
"Message 5",
)
$MessagesLabel = New-Object System.Windows.Forms.Label
$MessagesLabel.AutoSize = $true
$MessagesLabel.Location = New-Object System.Drawing.Point(10,50)
$Form.Controls.Add($MessagesLabel)
# Add_Shown action
$ShownFormAction = {
$Form.Activate()
foreach ($script in $ScriptsHome) {
$ProgressBar.Increment(1)
$MessagesLabel.Text = $Messages[$ProgressBar.Value - 1]
Start-Process $script.FullName -Wait -WindowStyle Hidden
}
$Form.Dispose()
}
$Form.Add_Shown($ShownFormAction)
# Show Form
$Form.ShowDialog()
#Create Logs
Invoke-Expression -Command .\LogScript.ps1
在 ScriptInstall 文件夹中,其中一个批处理脚本上有 10 个批处理和 vbs 脚本:
:error
cscript %base_dir%\fail.vbs > %Log%
:match
findstr /I /c:"xxxx" c:\match.txt
if %errorlevel% == 0 (
goto nextStep
) else (
goto ErrorCheck
)
在fail.vbs:
Dim vbCrLf : vbCrLf = Chr(13) & Chr(10)
Set WshShell = WScript.CreateObject("WScript.Shell")
MsgBox "Installation Fail !!!" & vbCrLf & "Message1" & vbCrLf & "Click OK to Exit" , 16, "Fail"
理想情况下,在此fail.vbs 框上按“确定”CallInstall.ps1 不应继续执行 ScriptInstall 文件夹中的其余脚本,但它会执行其他操作。它继续 ScriptInstall 文件夹中的剩余脚本,然后将执行返回到 bat1。
【问题讨论】:
-
如果可能的话,维护逻辑和停止/继续步骤会容易得多,如果您将尽可能多的逻辑移动到一种脚本类型中,而不是从 bat 调用 PowerShell,然后调用其他批处理文件调用 vbscript。在您的实例“原样”中,没有确定/取消,您需要从您的 vbscript 返回一个非零错误代码,如下所示:WScript.Quit 1
标签: powershell batch-file vbscript