peterleb

Powershell Datei umbenennen

Hallo Alle.

2021 hatte ich schon mal das Thema.
Fehler VBScript
Initial ging es um VBS, doch schlußendlich schlug colinardo ein kurzes knackiges Powershell-Script vor.
Der Dateiname bei ausführbaren Dateien soll um die Dateiversion erweitert werden.

Hier der Code:

param(
    [parameter(mandatory=$true)][ValidateScript({Test-Path $_})][string]$file
)
Get-Item -LiteralPath $file | rename-item -NewName {"$($_.BaseName).$($_.VersionInfo.FileVersion)$($_.Extension)"} -verbose    

Manche EXE-Dateien enthalten jedoch keine Dateiversion, dann kommt als Namensergänzung "0.0.0.0".
In diesem Fall soll statt Dateiversion die Produktversion eingesetzt werden.
Die Zeile: param( ... muß zwingend in der 1. Scriptzeile stehen, sonst wird "param" nicht als cmd erkannt.

Also wie frage ich vor "Get-Item ..." richtig ab, ob die Datei, die als Argument übergeben wird, eine gültige Dateiversion enthält, so daß ich statt dessen die Produktversion für die Umbenennung verwende?

Schwierig ist auch die Testerei, da das Script im Kontextmenü ausgeführt wird und ich die Fehlermeldungen nicht lesen kann.

Vielen Dank im Voraus für Eure Geistesblitze.
Gruß
Peter
Auf Facebook teilen
Auf X (Twitter) teilen
Auf Reddit teilen
Auf Linkedin teilen

Content-ID: 673011

Url: https://administrator.de/forum/powershell-datei-umbenennen-673011.html

Ausgedruckt am: 14.06.2025 um 10:06 Uhr

BiberMan
Lösung BiberMan 24.05.2025 aktualisiert um 20:05:53 Uhr
Goto Top
In diesem Fall soll statt Dateiversion die Produktversion eingesetzt werden
param(
    [parameter(mandatory=$true)][ValidateScript({Test-Path $_})][string]$file
)
Get-Item -LiteralPath $file | rename-item -NewName {"$($_.BaseName).$(if($_.VersionInfo.FileVersion -gt [version]'0.0.0.0'){$_.VersionInfo.FileVersion.toString().trim()}else{$_.VersionInfo.ProductVersion.toString().trim()})$($_.Extension)"} -verbose      
Schwierig ist auch die Testerei, da das Script im Kontextmenü ausgeführt wird und ich die Fehlermeldungen nicht lesen kann.
Einfach mit dem Dateinamen in einer gestarteten Konsole von Hand ausführen ...
./script.ps1 -file d:\Pfad\zur\datei.exe
Oder zum Start des Skripts über das Kontextmenü den Parameter -NoExit hinzufügen .
PeterleB
PeterleB 24.05.2025 um 13:54:30 Uhr
Goto Top
Das ist stark. Danke.
Zum Ausprobieren komme ich erst später.

Gruß
Peter
PeterleB
PeterleB 24.05.2025 aktualisiert um 19:25:29 Uhr
Goto Top
Also prinzipiell funktioniert es.
Wenn die Produktversion angewendet wird, werden jedoch eine Menge Leerzeichen angehängt.
Z. Bsp. : "svg_see_x64.1.0.0 ____________________ .exe"
(Die Unterstriche zur Demonstration, die Leerzeichen löscht die Formatierung hier)

Gruß
Peter.
BiberMan
BiberMan 24.05.2025 aktualisiert um 20:07:59 Uhr
Goto Top
Kann ich hier nicht nachvollziehen, im Normalfall sind das ja Version-Objekte die bei Umwandlung in Strings sowas nicht machen würden, muss wohl n' Parserfehler bei der Exe bzw. zus. Metadaten sein.
Habe aber im Code oben noch nen extra Trim() an die explizite Stringumwandlung eingefügt, das sollte es dann fixen...
PeterleB
PeterleB 24.05.2025 um 21:00:42 Uhr
Goto Top
Hallo BiberMan,

großartige Arbeit!
Jetzt klappt es wie gewünscht.
Ich markiere es als Lösung und
wünsche allen noch ein schönes Wochenende.

Gruß
Peter
PeterleB
PeterleB 28.05.2025 um 18:36:45 Uhr
Goto Top
Hallo,

muß nochmal nachhaken.
Für die aktuelle "TeamViewer_Setup_x64.exe"
bekomme ich immer TeamViewer_Setup_x64..exe, also nur den Punkt ohne Version,
obwohl die Dateieigenschaften so aussehen.

clipboard-image

Ich wollte mir im Terminal die Werte mit write-host anzeigen lassen, bekomme es aber nicht hin.
Sorry.

Gruß
Peter
BiberMan
BiberMan 28.05.2025 aktualisiert um 20:51:11 Uhr
Goto Top
Ist bei der genannten EXE normal. Nicht jede EXE bildet die Version über das Versioninfo Objekt ab sondern über eigene, das ist hier der Fall

1000004518
PeterleB
PeterleB 30.05.2025 aktualisiert um 18:18:53 Uhr
Goto Top
Hallo,

schön, dass nochmal reagiert wurde.

Überraschenderweise findet eine vbs-Version des Scriptes die Versionseigenschaften

fileversion = objShell.NameSpace(folder).ParseName(fso.GetFileName(arg)).ExtendedProperty("{0CEF7D53-FA64-11D1-A203-0000F81FEDEE} 4")  
productversion = objShell.NameSpace(folder).ParseName(fso.GetFileName(arg)).ExtendedProperty("{0CEF7D53-FA64-11D1-A203-0000F81FEDEE} 8")  

Könnte man das nicht mit Powershell auch machen?
Gruß
Peter
BiberMan
BiberMan 30.05.2025 aktualisiert um 19:26:04 Uhr
Goto Top
Erweiterte Dateieigenschaften mit Powershell-Funktion abfragen

$shell = New-Object -Com Shell.Application
$fileversion = $shell.NameSpace("D:\Ordner").ParseName("datei.exe").ExtendedProperty("System.FileVersion")    
PeterleB
PeterleB 30.05.2025 aktualisiert um 20:41:41 Uhr
Goto Top
Hallo,

vielen Dank.
Ich werde mich weiter bilden und die Sache umsetzen.

Schönes Wochenende
Peter

PS: Diese schöne Superkurzversion war ja eigentlich colinardos Idee.
PeterleB
PeterleB 02.06.2025 aktualisiert um 21:28:56 Uhr
Goto Top
Hallo nochmal.

Mit:
$fileversion = $shell.NameSpace($Directory).ParseName($FName).ExtendedProperty("System.FileVersion")  

bekomme ich ein Ergebnis,
mit:
$productversion = $shell.NameSpace($Directory).ParseName($FName).ExtendedProperty("System.ProductVersion")  

jedoch einen leeren String.
Aber mit:
$productversion = $shell.NameSpace($Directory).ParseName($FName).ExtendedProperty("{0CEF7D53-FA64-11D1-A203-0000F81FEDEE} 8")  

erhalte ich für die gleiche Datei einen Wert.
Gibt es "System.ProductVersion" nicht?

Ich bastle unermüdlich weiter.
Gruß
Peter
PeterleB
PeterleB 03.06.2025 um 09:59:17 Uhr
Goto Top
Hallo.
Ein letzter Post dazu.
Es werden jetzt alle Varianten der Versionsinfo abgefragt und eine gültige für den Dateinamen verwendet.
Der Code ist vielleicht nicht besonders elegant, aber funktioniert.

param(
    [parameter(mandatory=$true)][ValidateScript({Test-Path $_})][string]$file
)

$Directory = $((Get-Item $file).DirectoryName) + "\"  
$FName = $((Get-Item $file).Name)

$shell = New-Object -Com Shell.Application

# $fileversion = $shell.NameSpace($Directory).ParseName($FName).ExtendedProperty("System.FileVersion")  
$fileversion = $shell.NameSpace($Directory).ParseName($FName).ExtendedProperty("{0CEF7D53-FA64-11D1-A203-0000F81FEDEE} 4")   
# $productversion = $shell.NameSpace($Directory).ParseName($FName).ExtendedProperty("System.ProductVersion")  
$productversion = $shell.NameSpace($Directory).ParseName($FName).ExtendedProperty("{0CEF7D53-FA64-11D1-A203-0000F81FEDEE} 8")  

$VIfileversion = $((Get-Item $file).VersionInfo.FileVersion)
$VIproductversion = $((Get-Item $file).VersionInfo.ProductVersion)

# write-host "Dateiversion: " $fileversion  " / " $VIFileVersion 
# write-host "Produktversion: " $productversion " / " $VIProductVersion 

$werte = @($fileversion, $productversion, $VIFileVersion, $VIProductVersion)
$FVersion = $werte | Where-Object { -not [string]::IsNullOrEmpty($_) } | Select-Object -First 1

# Write-Output "Version: $FVersion" 

# Get-Item -LiteralPath $file | rename-item -NewName {"$($_.BaseName).$(if($_.VersionInfo.FileVersion -gt [version]'0.0.0.0'){$_.VersionInfo.FileVersion.toString().trim()}else{$_.VersionInfo.ProductVersion.toString().trim()})$($_.Extension)"} -verbose       
Get-Item -LiteralPath $file | rename-item -NewName {"$($_.BaseName).$($FVersion)$($_.Extension)"} -verbose  

Gruß
Peter