Ich kann ein PowerShell-Skript nicht stoppen, wenn die Batch-Skripts, die von diesen PowerShell-Skripten aufgerufen werden, einen Fehler ausgeben.Ausführung des PowerShell-Skripts stoppen und zur ursprünglichen Stapeldatei zurückkehren
bittet 1:
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& '%PowerShellScriptPath%\CallInstall.ps1'";
CallInstall.ps1
Anrufe paar Batch-Dateien und vbs-Dateien im Fall eines Ausfalls einer Voraussetzung nennt das bat2 eine vbs basierten Message-Box einen Fehler anzuzeigen. Im Idealfall sollte zu diesem Zeitpunkt die Ausführung stoppen und der Bat1 sollte den verbleibenden Prozess starten, aber in meinem Fall CallInstall.ps1
führt immer noch alle Batch-und VBS-Skripte vor dem Zurückgehen zu bat1.
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
Im Inneren des ScriptInstall Ordner gibt es 10 Batch und vbs-Skripten auf einen der Batch-Skript:
:error
cscript %base_dir%\fail.vbs > %Log%
:match
findstr /I /c:"xxxx" c:\match.txt
if %errorlevel% == 0 (
goto nextStep
) else (
goto ErrorCheck
)
und in 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"
Idealer nach dem Drücken ok auf diesem fail.vbs
Die Box CallInstall.ps1
sollte nicht mit dem Rest der Skripte im ScriptInstall-Ordner fortfahren, aber ansonsten. Es wird mit den verbleibenden Skripten im ScriptInstall-Ordner fortgesetzt und die Ausführung anschließend an bat1 zurückgegeben.
Wenn möglich, wird es viel einfacher, die Logik und Stop/Continue-Schritte beizubehalten, wenn Sie so viel von der Logik in einen Skript-Typ bewegen, anstatt PowerShell von bat aufrufen und andere Batch-Dateien aufrufen VBScript. In Ihrer Instanz 'as-is', ohne OK/cancel, müssen Sie einen Nicht-Null-Fehlercode aus Ihrem VBScript zurücksenden, wie folgt: WScript.Quit 1 – TechSpud