Powershell File exist
Hallo Freunde,
ich komme mit einem kleinen Problem nicht klar.
Mit einer Kontextmenü-Erweiterung wird ein PS-Script aufgerufen, das eine Datei mit dem Namen des Ordners umbenennt.
Das klappt ganz hervorragend, aber natürlich nicht bei vorhandener Datei.
Und ich bekomme es nicht hin, den zukünftigen Dateinamen vor der Rename-Aktion abzufragen.
Hat jemand einen guten Tipp?
Danke
Peter
ich komme mit einem kleinen Problem nicht klar.
Mit einer Kontextmenü-Erweiterung wird ein PS-Script aufgerufen, das eine Datei mit dem Namen des Ordners umbenennt.
Param(
[string]$FName
)
# Prüfen auf bereits existierende Datei ?
# Umbenennen der Datei mit Ordnername plus vorhandene Erweiterung
Get-ChildItem $FName | Rename-Item -NewName {$_.Directory.Name + $_.Extension}
Das klappt ganz hervorragend, aber natürlich nicht bei vorhandener Datei.
Und ich bekomme es nicht hin, den zukünftigen Dateinamen vor der Rename-Aktion abzufragen.
Hat jemand einen guten Tipp?
Danke
Peter
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 4398881481
Url: https://administrator.de/contentid/4398881481
Ausgedruckt am: 19.11.2024 um 04:11 Uhr
5 Kommentare
Neuester Kommentar
Servus Peter,
Bei der Verwendung von TryCatch muss man die CMDLets mit einer ErrorAction versehen, damit diese auch eine Exception werfen, denn per Session-Default steht deren ErrorAction auf "Continue". Ansonsten wird der Catch-Teil niemals ausgeführt weil die CMDLets keine echte Exception werfen.
Das lässt sich auf zwei Arten erreichen. Entweder man setzt die spezielle Variable $ErrorActionPreference auf 'Stop' wie ich es oben tue, oder man gibt das direkt in den CMDLets, mit dem Parameter -ErrorAction Stop an.
Das erstere definiert die Aktion global in der aktuellen Session, es gilt dort dann also für alle CMDLets, außer man überschreibt die Action in einem CMDLet mit dem o.g. Parameter -ErrorAction.
An die Exception und deren Eigenschaften selbst im Catch Teil kommst du mit der Funktions-Parameter Variablen $_ und der Eigenschaft Exception.
Des weiteren musst du das Assembly System.Windows.Forms vorladen da dieses per Default nicht in einer Powershell-Session vorhanden ist, nur in der ISE ist das der Fall.
Grüße Uwe
Alles, was Sie schon immer über Ausnahmen wissen wollten
Powershell Leitfaden für Anfänger
Param(
[string]$FName
)
# Assembly für die Messagebox laden
Add-Type -A System.Windows.Forms
# Fehler lösen hiermit per Default eine Exception aus
$ErrorActionPreference = 'Stop'
try {
# Umbenennung
Get-Item $FName -Force | Rename-Item -NewName {$_.Directory.Name + $_.Extension}
}catch{
# Errorhandling
[System.Windows.Forms.MessageBox]::Show("ERROR: $($_.Exception.Message)","ERROR",0,16)
}
Das lässt sich auf zwei Arten erreichen. Entweder man setzt die spezielle Variable $ErrorActionPreference auf 'Stop' wie ich es oben tue, oder man gibt das direkt in den CMDLets, mit dem Parameter -ErrorAction Stop an.
Das erstere definiert die Aktion global in der aktuellen Session, es gilt dort dann also für alle CMDLets, außer man überschreibt die Action in einem CMDLet mit dem o.g. Parameter -ErrorAction.
An die Exception und deren Eigenschaften selbst im Catch Teil kommst du mit der Funktions-Parameter Variablen $_ und der Eigenschaft Exception.
Des weiteren musst du das Assembly System.Windows.Forms vorladen da dieses per Default nicht in einer Powershell-Session vorhanden ist, nur in der ISE ist das der Fall.
Grüße Uwe
Alles, was Sie schon immer über Ausnahmen wissen wollten
Powershell Leitfaden für Anfänger