Dateieigenschaften aus der Registerkarte (Details) auslesen und als Text kopieren
Hallo,
unter Eigenschaften einer .exe-Datei gibt es auf der Registerkarte „Details“ Informationen, welche sich leider nicht kopieren lassen. Wäre es irgendwie möglich diese Informationen abzufragen?
Auf dem nachfolgenden Bild sieht man, was ich meine
Etwas ähnliches macht das vbs-Skript hier:
Hier kann man über DateCreated Property nachlesen: http://msdn.microsoft.com/en-us/library/ke6a7czx(VS.85).aspx
Und unten werden alle möglichen Eigenschaften als Referenz dazu aufgelistet:
Attributes Property
DateLastAccessed Property
DateLastModified Property
Drive Property
Files Property (FileSystemObject)
IsRootFolder Property
Name Property (FileSystemObject)
ParentFolder Property
Path Property (FileSystemObject)
ShortName Property
ShortPath Property
Size Property
SubFolders Property
Type Property
In meinem Falle müssen jedoch die Details-Informationen abgefragt werden (vor allem die Attribute Dateiversion und Produktversion).
Und im Gegensatz zu dem obigen Skript einen ganzen Ordner zu durchsuchen, plane ich nur die ausgewählten Dateien als Argument zu verarbeiten (indem ich sie einfach auf eine Batch-Datei oder vbs-Skript ziehe und loslasse, bzw. über sendto an das Skript sende) und dann z. B. in sich öffnendem CMD-Fenster oder einer txt-Datei die notwendigen Informationen herauskopiere.
Danke für paar Anregungen zur Lösung dieses Problems.
Gruß
evinben
unter Eigenschaften einer .exe-Datei gibt es auf der Registerkarte „Details“ Informationen, welche sich leider nicht kopieren lassen. Wäre es irgendwie möglich diese Informationen abzufragen?
Auf dem nachfolgenden Bild sieht man, was ich meine
Etwas ähnliches macht das vbs-Skript hier:
'Aufruf z. B. in der CMD wie folgt
'cscript //nologo Datei-Eigenschaften_auslesen.vbs c:\Pfad_zum_Ordner >> Dateiliste.txt
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.Namespace(Wscript.arguments(0))
For Each strFileName in objFolder.Items
strName = objFolder.GetDetailsOf(strFileName, 0)
If InstrRev(strName, ".") > 1 Then strName = Left(strName, InstrRev(strName, ".") - 1)
Wscript.echo strName & " " & objFolder.GetDetailsOf(strFileName, 14)
Next
Und unten werden alle möglichen Eigenschaften als Referenz dazu aufgelistet:
Attributes Property
DateLastAccessed Property
DateLastModified Property
Drive Property
Files Property (FileSystemObject)
IsRootFolder Property
Name Property (FileSystemObject)
ParentFolder Property
Path Property (FileSystemObject)
ShortName Property
ShortPath Property
Size Property
SubFolders Property
Type Property
In meinem Falle müssen jedoch die Details-Informationen abgefragt werden (vor allem die Attribute Dateiversion und Produktversion).
Und im Gegensatz zu dem obigen Skript einen ganzen Ordner zu durchsuchen, plane ich nur die ausgewählten Dateien als Argument zu verarbeiten (indem ich sie einfach auf eine Batch-Datei oder vbs-Skript ziehe und loslasse, bzw. über sendto an das Skript sende) und dann z. B. in sich öffnendem CMD-Fenster oder einer txt-Datei die notwendigen Informationen herauskopiere.
Danke für paar Anregungen zur Lösung dieses Problems.
Gruß
evinben
Please also mark the comments that contributed to the solution of the article
Content-Key: 241735
Url: https://administrator.de/contentid/241735
Printed on: May 9, 2024 at 13:05 o'clock
13 Comments
Latest comment
Moin envinben,
dafür habe ich mal eine Powershell-Funktion geschrieben:
Erweiterte Dateieigenschaften mit Powershell-Funktion abfragen
Passend dazu dann ein Aufruf mit der obigen Funktion und Anzeige nur deiner bevorzugten Eigenschaften:
Zusammengefasst in einer .ps1 Datei, könnte das dann so aussehen: Dem Script übergibt man als Parameter einen Dateipfad, und als Ergebnis werden alle Dateieigenschaften in die Zwischenablage kopiert. Der Aufruf erfolgt dann z.B. so
Grüße Uwe
dafür habe ich mal eine Powershell-Funktion geschrieben:
Erweiterte Dateieigenschaften mit Powershell-Funktion abfragen
Passend dazu dann ein Aufruf mit der obigen Funktion und Anzeige nur deiner bevorzugten Eigenschaften:
dir "c:\testdatei.exe" | Add-ExtendedFileProperties | select Name,Dateiversion,Produktversion
Zusammengefasst in einer .ps1 Datei, könnte das dann so aussehen: Dem Script übergibt man als Parameter einen Dateipfad, und als Ergebnis werden alle Dateieigenschaften in die Zwischenablage kopiert. Der Aufruf erfolgt dann z.B. so
"C:\copy-fileproperties.ps1" "C:\deinedatei.exe"
copy-fileproperties.ps1
param(
[parameter(mandatory=$true)][ValidateNotNullOrEmpty()][string]$file
)
function Add-ExtendedFileProperties{
<#
.SYNOPSIS
Fügt erweiterte Eigenschaften von Dateien an das Objekt in der Pipline hinzu
.DESCRIPTION
Extrahiert erweiterte Eigenschaften von Dateien wie z.B. Exif-Daten, Musik- bzw. Filmdetails
.EXAMPLE
Get-ChildItem "C:\Temp" | Add-ExtendedFileProperties -PropertyExtended "Bildhöhe","Bildbreite","Bitrate" | ft Name,Bildhöhe,Bildbreite,Bitrate
Fügt alle nur die Eigenschaften "Bildhöhe","Bildbreite","Bitrate" als zusätzliche Spalten dem Objekt in der Pipline hinzu
.EXAMPLE
Get-ChildItem "C:\Temp" | Add-ExtendedFileProperties | fl *
Fügt alle verfügbaren erweiterten Eigenschaften dem Objekt in der Pipline hinzu
.PARAMETER PropertyExtended
Mit diesem Parameter geben sie eine Komma-Separierte Liste von Eigenschaften an welche sie erhalten möchten.
-PropertyExtended "Bildhöhe","Bildbreite","Bitrate"
#>
param(
[Parameter(Mandatory=$true,ValueFromPipeline=$True,ValueFromPipelineByPropertyName=$True)]
$fileItem,
[String[]] $PropertyExtended = "ALL"
)
begin
{
$shellObject = New-Object -Com Shell.Application
$itemProperties = $null
}
process
{
if($fileItem.PsIsContainer)
{
$fileItem
return
}
$directoryName = $fileItem.DirectoryName
$filename = $fileItem.Name
$folderObject = $shellObject.NameSpace($directoryName)
$item = $folderObject.ParseName($filename)
if(-not $itemProperties)
{
$itemProperties = @{}
$counter = 0
$columnName = ""
if ($PropertyExtended -eq "ALL"){
#get all properties
do {
$columnName = $folderObject.GetDetailsOf($folderObject.Items, $counter)
if($columnName) { $itemProperties[$counter] = $columnName }
$counter++
}while($columnName)
}else{
#get user defined properties
do {
$columnName = $folderObject.GetDetailsOf($folderObject.Items, $counter)
foreach($name in $PropertyExtended){
if ($columnName.toLower() -eq $name.toLower()){
$itemProperties[$counter] = $columnName
}
}
$counter++
}while($columnName)
}
}
foreach($itemProperty in $itemProperties.Keys)
{
$fileItem | Add-Member NoteProperty $itemProperties[$itemProperty] `
$folderObject.GetDetailsOf($item, $itemProperty) -ErrorAction `
SilentlyContinue
}
$fileItem
}
}
if ((Test-Path $file)){
$infos = dir $file | Add-ExtendedFileProperties | fl * | out-string
[Windows.Clipboard]::SetText($infos)
Write-host "Daten wurden in die Zwischenablage kopiert!" -ForegroundColor Green
}else{
write-host "Die Datei konnte nicht gefunden werden" -ForegroundColor Red
}
Hallo evinben!
Und in VBS in etwa so:
Grüße Dieter
Und in VBS in etwa so:
Const Liste = "D:\Temp\Namespace-Liste.txt" 'Pfad für Liste mit DetailOf-Namen und zugehöriger Nummer
Const D_Name = 0
Const D_Dateiversion = 156
Const D_Produktversion = 271
'Dieser Code erzeugt eine Text-Liste mit allen DetailOf-Namen
Sub ListDetailOfNames()
Dim objFolder, strName, strText
Set objFolder = CreateObject("Shell.Application").Namespace("C:\Windows")
For Each strName In objFolder.Items
For i = 0 To 300
strText = strText & Right("00" & i, 3) & " - " & objFolder.GetDetailsOf(Null, i) & vbNewLine
Next
Exit For
Next
CreateObject("Scripting.FileSystemObject").CreateTextFile(Liste).Write strText
End Sub
Sub ReadDetailOfFiles()
Dim objShell, objFolder, strFileName, strName, strDateiversion, strProduktversion
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.Namespace(Wscript.arguments(0))
For Each strFileName In objFolder.Items
With objFolder
strName = Split(.GetDetailsOf(strFileName, D_Name), ".")(0)
strDateiversion = .GetDetailsOf(strFileName, D_Dateiversion)
strProduktversion = .GetDetailsOf(strFileName, D_Produktversion)
End With
Next
End Sub
Grüße Dieter
Hallo evinben!
Das ist kein fertiges Script zur Ausführung. Die erste Sub zeigt nur, wie man per VBS die Eigenschaftsnamen ermitteln und in eine Text-Datei schreiben kann und die zweite Sub nur, wie man die Details ausliest (aktuell ohne Textexport).
Haben beide den gleichen Effekt...
Mit diesem VB-Script kannst Du eine Liste mit Detailnamen erzeugen:
Aus dieser Liste kannst Du die Detailnamen aussuchen, die für Dich wichtig sind...
Zum Auslesen wäre es interessant zu wissen, ob Du nur einzelne Dateien oder z.B. alle *.exe-Dateien in einem Ordner auslesen willst. Außerdem, ob Du die Ausgabe Zeilenweise oder im Csv-Format haben möchtest?
Grüße Dieter
Das ist kein fertiges Script zur Ausführung. Die erste Sub zeigt nur, wie man per VBS die Eigenschaftsnamen ermitteln und in eine Text-Datei schreiben kann und die zweite Sub nur, wie man die Details ausliest (aktuell ohne Textexport).
und dabei eine Datei "Namespace-Liste.txt" im Verzeichnis "D:\Temp\" erstelle, werde keine Informationen reingeschrieben.
Die Datei wird vom Script unter der angegebenen Pfadangabe (z.B. "E:\Test\Dateiname) erzeugt...Const D_Dateiversion = 156
Sind festgelegte Konstanten, die der Zahl zwecks besserer Lesbarkeit einen Namen geben:objFolder.GetDetailsOf(strFileName, 156)
'oder
objFolder.GetDetailsOf(strFileName, D_Dateiversion)
Mit diesem VB-Script kannst Du eine Liste mit Detailnamen erzeugen:
'Erzeugt eine Liste (Pfad anpassen) mit DetailOf-Namen und zugehöriger Nummer
Const Liste = "E:\Test\Namespace-Liste.txt"
Dim objFolder, strName, strText, i
Set objFolder = CreateObject("Shell.Application").Namespace("C:\")
For Each strName In objFolder.Items
For i = 0 To 300
strText = strText & Right("00" & i, 3) & " - " & objFolder.GetDetailsOf(Null, i) & vbNewLine
Next
Exit For
Next
CreateObject("Scripting.FileSystemObject").CreateTextFile(Liste).Write strText
Zum Auslesen wäre es interessant zu wissen, ob Du nur einzelne Dateien oder z.B. alle *.exe-Dateien in einem Ordner auslesen willst. Außerdem, ob Du die Ausgabe Zeilenweise oder im Csv-Format haben möchtest?
Grüße Dieter
Hallo Enviben,
die Anführungszeichen hatte ich vergessen, sorry dafür.
Der Aufruf in einer Batch ist auch kein Problem, dazu schreibst du dir folgende Batch:
Dann kannst du der Batchdatei über den ersten Parameter den Pfad des Files mit übergeben, oder dein File via Sendas oder Drag n' Drop drauf werfen. Mit diesem abgeänderten Script zeigt es dann nur deine gewünschten Eigenschaften direkt in der Konsole an:
Grüße Uwe
die Anführungszeichen hatte ich vergessen, sorry dafür.
Der Aufruf in einer Batch ist auch kein Problem, dazu schreibst du dir folgende Batch:
@echo off
powershell.exe ".'E:\Pfad zum Script\show_fileattributes.ps1' '%~1'"
pause
param(
[parameter(mandatory=$true)][ValidateNotNullOrEmpty()][string]$file
)
function Add-ExtendedFileProperties{
<#
.SYNOPSIS
Fügt erweiterte Eigenschaften von Dateien an das Objekt in der Pipline hinzu
.DESCRIPTION
Extrahiert erweiterte Eigenschaften von Dateien wie z.B. Exif-Daten, Musik- bzw. Filmdetails
.EXAMPLE
Get-ChildItem "C:\Temp" | Add-ExtendedFileProperties -PropertyExtended "Bildhöhe","Bildbreite","Bitrate" | ft Name,Bildhöhe,Bildbreite,Bitrate
Fügt alle nur die Eigenschaften "Bildhöhe","Bildbreite","Bitrate" als zusätzliche Spalten dem Objekt in der Pipline hinzu
.EXAMPLE
Get-ChildItem "C:\Temp" | Add-ExtendedFileProperties | fl *
Fügt alle verfügbaren erweiterten Eigenschaften dem Objekt in der Pipline hinzu
.PARAMETER PropertyExtended
Mit diesem Parameter geben sie eine Komma-Separierte Liste von Eigenschaften an welche sie erhalten möchten.
-PropertyExtended "Bildhöhe","Bildbreite","Bitrate"
#>
param(
[Parameter(Mandatory=$true,ValueFromPipeline=$True,ValueFromPipelineByPropertyName=$True)]
$fileItem,
[String[]] $PropertyExtended = "ALL"
)
begin
{
$shellObject = New-Object -Com Shell.Application
$itemProperties = $null
}
process
{
if($fileItem.PsIsContainer)
{
$fileItem
return
}
$directoryName = $fileItem.DirectoryName
$filename = $fileItem.Name
$folderObject = $shellObject.NameSpace($directoryName)
$item = $folderObject.ParseName($filename)
if(-not $itemProperties)
{
$itemProperties = @{}
$counter = 0
$columnName = ""
if ($PropertyExtended -eq "ALL"){
#get all properties
do {
$columnName = $folderObject.GetDetailsOf($folderObject.Items, $counter)
if($columnName) { $itemProperties[$counter] = $columnName }
$counter++
}while($columnName)
}else{
#get user defined properties
do {
$columnName = $folderObject.GetDetailsOf($folderObject.Items, $counter)
foreach($name in $PropertyExtended){
if ($columnName.toLower() -eq $name.toLower()){
$itemProperties[$counter] = $columnName
}
}
$counter++
}while($columnName)
}
}
foreach($itemProperty in $itemProperties.Keys)
{
$fileItem | Add-Member NoteProperty $itemProperties[$itemProperty] `
$folderObject.GetDetailsOf($item, $itemProperty) -ErrorAction `
SilentlyContinue
}
$fileItem
}
}
if ((Test-Path $file)){
dir $file | Add-ExtendedFileProperties -PropertyExtended Dateiversion,Produktversion | fl Dateiversion,Produktversion
}else{
write-host "Die Datei konnte nicht gefunden werden" -ForegroundColor Red
}
du kannst dir einfach eine neue Verknüpfung anlegen und dies dort reinschreiben:
dann kannst du auf diese Verknüpfung dein File werfen, und benötigst keine Zwischenbatch mehr.
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -nologo -noexit -File "D:\Datei-Eigenschaften auslesen\GetFileproperties.ps1"
Zitat von @evinben:
dann besteht aber das Problem mit der Pfadbeziehung. In einer Batch habe ich mit %~dp0
etwas ähnliches lässt sich auch mit der Verknüpfung erreichen:dann besteht aber das Problem mit der Pfadbeziehung. In einer Batch habe ich mit %~dp0
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -nologo -noexit -File ".\GetFileproperties.ps1"