peterleb
Goto Top

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.

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

Content-Key: 4398881481

Url: https://administrator.de/contentid/4398881481

Printed on: April 19, 2024 at 21:04 o'clock

Member: PeterleB
PeterleB Oct 25, 2022 updated at 17:59:34 (UTC)
Goto Top
Hallo,

bin selbst ein paar Ideen weiter.
Den zukünftigen Namen bekomme ich jetzt schon raus.

Param(
    [string]$FName
)
# Prüfen auf bereits existierende Datei ?
$File = Get-ChildItem $FName
$NName = $File.Directory.Name + $File.Extension
 
# Umbenennen der Datei mit Ordnername plus vorhandene Erweiterung
Get-ChildItem $FName | Rename-Item -NewName {$_.Directory.Name + $_.Extension}

Ist Test-Path eine Möglichkeit?
Mir fehlt sowas wie $File.FullPath
Dann könnte ich abfragen:

Test-Path $File.FullPath + $NName

Korrektur:
Es gibt $File.DirectoryName und $File.Directory.Name ! (Der Punkt macht den Unterschied)
Also ergänze ich:
$NFile = $File.DirectoryName + '\' + $NName  
Dann sollte:
Test-Path $NFile
ein Ergebnis bringen.

Oder?
Member: PeterleB
PeterleB Oct 25, 2022 at 18:16:08 (UTC)
Goto Top
Also Jungs und Mädels,

über 100 Leser und kein Kommentar.
Vielleicht ist es zu trivial.

Das Script sieht jetzt so aus:
Param(
    [string]$FName
)
# Prüfen auf bereits existierende Datei
$File = Get-ChildItem $FName
$NName = $File.DirectoryName + '\' +  $File.Directory.Name + $File.Extension  
if (!(Test-Path $NName)) { 
# Umbenennen der Datei mit Ordnername plus vorhandene Erweiterung
Get-ChildItem $FName | Rename-Item -NewName {$_.Directory.Name + $_.Extension}
}

Oder geht es noch schöner?
Gruß
Peter
Member: PeterleB
PeterleB Oct 26, 2022 updated at 07:31:35 (UTC)
Goto Top
Hallo, Guten Morgen

Das Thema läßt mich nicht los.
Da es ja auch noch andere Exceptions wie Zugriffsrechte oder Namenskonventionen etc. gibt, würde ich gern
die Fehlerbehandlung mit try-catch-finally machen und den Fehler in einer Messagebox ausgeben.
Die Grundstruktur habe ich verstanden, aber ich bekomme die Auswertung nicht hin.

Ist dies ein möglicher Konstrukt?
$Fehler = $error.Exception.GetType().FullName
[System.Windows.Forms.MessageBox]::Show($Fehler,"Fehler",0)  

Würde mich freuen, wenn sich einer unserer PS-Gurus mal meldet.
Gruß
Peter

PS: Ich ergänze nochmal das ganze Script
Param(
    [string]$FName
)
try {
    # Prüfen auf bereits existierende Datei
    $File = Get-ChildItem $FName
    $NName = $File.DirectoryName + '\' +  $File.Directory.Name + $File.Extension  
    #if (!(Test-Path $NName)) { 
        # Umbenennen der Datei mit Ordnername plus vorhandene Erweiterung
        Get-ChildItem $FName | Rename-Item -NewName {$_.Directory.Name + $_.Extension}
    #    }
    #    else {
    #    [System.Windows.Forms.MessageBox]::Show("Datei existiert bereits","Fehler",0) 
    #    }
    }
catch {
    $Fehler = $error.Exception.GetType().FullName
    [System.Windows.Forms.MessageBox]::Show($Fehler,"Fehler",0)  
    }
finally {
    # Nothing
    }
Member: colinardo
Solution colinardo Oct 26, 2022 updated at 08:47:57 (UTC)
Goto Top
Servus Peter,
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)   
} 
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
Member: PeterleB
PeterleB Oct 26, 2022 updated at 08:58:26 (UTC)
Goto Top
Hallo Uwe,

ich hatte auf Dich gehofft!
Ich danke Dir wie verrückt.
Aber ich hatte mich auch schon ganz schön nahe an die Lösung ran gepirscht.
Deine Erklärung ist sehr verständlich.
Ich hatte auch auf mehreren Seiten über ErrorAction gelesen, jedoch die Umsetzung nicht hin bekommen.


Vielen Dank nochmal.
Gruß
Peter

PS: Die Links sind Spitze!
Und: Es kommt natürlich noch ein Kommentar in das Script.
# Perfected by colinardo / Uwe from administrator.de