Jump to content

Prüfen, ob ein Befehl erfolgreich ausgeführt wurde


Empfohlene Beiträge

Liebes Forum,

 

ich erstelle einen Shortcut:

$WshShell = New-Object -comObject WScript.Shell
$Shortcut = $WshShell.CreateShortcut("\\fs1\drive-i\scharping\Scans.lnk")
$Shortcut.TargetPath = "\\fs1\scan2file\$user"
$Shortcut.Save()

Sollte der letzte Befehl (das Speichern) scheitern, hätte ich das gerne behandelt, es soll also in einer Variablen gespeichert werden, ob der erfolgreich war, also $true oder $false.

Ich könnte für dieses Beispiel einfach mit "TestPath" prüfen, ob der Link existiert, aber ich möchte das gerne allgemein halten, um diese Prüfung auf Ausführung auch für andere Befehle nutzen zu können.

Wie ist das allgemein möglich?

 

Viele Grüße

Davorin

bearbeitet von Scharping-FVB
allgemein Halten eingefügt
Link zu diesem Kommentar

Informiere dich über try/catch.

Außerdem gibt es z.B. diverse Variablen $? / $error -> https://www.msxfaq.de/code/powershell/pserrhandling.htm

 

PS > $?
True
PS > 2/0
Es wurde versucht, durch 0 (null) zu teilen.
In Zeile:1 Zeichen:1
+ 2/0
+ ~~~
    + CategoryInfo          : NotSpecified: (:) [], RuntimeException
    + FullyQualifiedErrorId : RuntimeException

PS > $?
False
PS > $error
Es wurde versucht, durch 0 (null) zu teilen.
In Zeile:1 Zeichen:1
+ 2/0
+ ~~~
    + CategoryInfo          : NotSpecified: (:) [], RuntimeException
    + FullyQualifiedErrorId : RuntimeException

 

bearbeitet von Dukel
Link zu diesem Kommentar
vor 5 Minuten schrieb Dukel:

Informiere dich über try/catch.

Das funktioniert hier nicht, habe ich als erstes versucht.

try {
	$Shortcut.Save() -erroraction stop
}

Erroraction wird nicht (an)erkannt:

+     $Shortcut.Save() -erroraction stop
+                      ~~~~~~~~~~~~
Unexpected token '-erroraction' in expression or statement.

Ich habe das jetzt so gelöst:

    $ErrorActionPreference = "SilentlyContinue"

    $WshShell = New-Object -comObject WScript.Shell
    $Shortcut = $WshShell.CreateShortcut("\\fs2\drive-i\$user\$LinkName.lnk")
    $Shortcut.TargetPath = "\\fs1\scan2file\$user"
    $LinkName = $Shortcut.FullName
    $LinkLocation = $Shortcut.TargetPath
    $Shortcut.Save()
    
    if($?) {
        Write-Host "Link ""$LinkName"" wurde im Pfad ""$LinkLocation"" angelegt." -ForegroundColor green
    }
    else {
        Write-Host "Es gab einen Fehler beim Anlegen des Links ""$LinkName"". Bitte manuell nacharbeiten." -ForegroundColor Red
    }

Mit if ($?) wird geprüft, ob $Shortcut.save() $true war und entsprechend reagiert.

 

Vielen Dank für die Anregungen und Hilfen :-)

Link zu diesem Kommentar

Try Catch geht nur, wenn das, was du ausführst, eine Exeption wirft.

In deinem Fall brauchst du $?, aber du wolltest das generell wissen -> Try/Catch um Exceptions abzufangen.

 

EDIT: Du brauchst bei einfachen Variablen keine Doppelten Quotes:

Write-Host "Es gab einen Fehler beim Anlegen des Links $LinkName. Bitte manuell nacharbeiten."

 

bearbeitet von Dukel
Link zu diesem Kommentar

WSH-Objekte schmeißen eine Terminating Exception - bei mir zumindest:

Try {
    $WshShell = New-Object -comObject WScript.Shell
    $Shortcut = $WshShell.CreateShortcut("$env:temp\Blubb\Scans.lnk")
    $Shortcut.TargetPath = "\\fs1\scan2file\$user"
    $Shortcut.Save()
} Catch {
    $MyError = $_
    Write-Host "Message: $( $MyError.Exception.Message )"
    Write-Host "HResult: $( $MyError.Exception.HResult )"
}

 

Was Du mit dem HResult anfängst, bleibt dann Dir überlassen :-)

bearbeitet von daabm
Link zu diesem Kommentar
vor 19 Stunden schrieb Dukel:

EDIT: Du brauchst bei einfachen Variablen keine Doppelten Quotes:

Write-Host "Es gab einen Fehler beim Anlegen des Links $LinkName. Bitte manuell nacharbeiten."

 

Der Inhalt der Variable soll aber in Anführungszeichen ausgegeben werden ;-)

Ich meine, dass es da noch etwas technischeres gibt, fällt mir aber gerade nicht ein.

Link zu diesem Kommentar
vor 57 Minuten schrieb Scharping-FVB:

Der Inhalt der Variable soll aber in Anführungszeichen ausgegeben werden ;-)

 .... nur die Variable oder der ganze Text?

 

Wenn Du innerhalb von Anführungszeichen Anführungszeichen ausgeben möchtest, musst Du sie einfach "escapen". 🤷🏼‍♂️

 

Das geht entweder mit Backticks oder Du verdoppelst sie ... 

 

$LinkName = 'BlaKeks'
"Es gab einen Fehler beim Anlegen des Links `"$LinkName`". Bitte manuell nacharbeiten."
"Es gab einen Fehler beim Anlegen des Links ""$LinkName"". Bitte manuell nacharbeiten."

 

Edit: 

 

... oder Du nimmst einfache Anführungszeichen  ...

 

"Es gab einen Fehler beim Anlegen des Links '$LinkName'. Bitte manuell nacharbeiten."

 

bearbeitet von BOfH_666
Link zu diesem Kommentar

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...