Hvordan kan jeg få et Windows execuable's 'Original Filnavn' detaljeringsfelt ved hjælp af cmd/batch

Indlæg af Hanne Mølgaard Plasc

Problem



På Windows har MZ/PE-eksekverbare ofte en attibute kaldet 'Original File Name', der bruges til at beskrive det originale filnavn, der er tildelt en eksekverbar fil, da den blev oprettet.


Det kan læses til en Windows-bruger fra fanen 'Detaljer' i vinduet 's' Egenskaber '(åbnes ved at højreklikke en fil og vælge' Egenskaber ').


Jeg fandt mange andre spørgsmål, der diskuterer 'originalt filnavn, så for at gøre det klart, jeg snakker om dette felt, til filen mspaint.exe:


Til minde om det er annonceret død, håber jeg at gestus vil blive værdsat :) [3]


Jeg vil imidlertid gerne have adgang til/læse denne attribut (og muligvis redigere den) ved hjælp af batch-filer eller Windows-kommandolinjen (ikke powershell, tak!).


Tak!

Bedste reference


Windows har ikke et indbygget kommandolinjeværktøj til at læse versionsinformation fra PE-filer.


Du kan bruge en ressource editor som Resource Hacker til at eksportere oplysninger, men du skal stadig analysere den eksporterede fil. [4]


På WinVista + (og WinXP med desktop søgning installeret) kan du læse oplysningerne ved hjælp af shell-ejendomssystemet (den samme API, der bruges af dialogboksen Filegenskaber).


En Microsoft-udvikler har oprettet et gratis værktøj kaldet shellproperty.exe, som du kan bruge til at læse ejendommen System.OriginalFileName. [5]


Med Windows Script Host er det også muligt at få adgang til ejendomssystemet, hvis du bruger ShellFolderItem.ExtendedProperty-metoden. [6]


Og endelig kan et WSH script sammenfletes med en batchfil for at skabe en arbejdspolyglot med nul eksterne afhængigheder: [7]


@if (1 == 0) @end /*
@cscript.exe /E:jscript /nologo "\%~f0" \%*
@goto :eof
*/

var objShell = new ActiveXObject("shell.application");
var objFolder2, ssfSysDir = 0x25, propVal = "";
objFolder2 = objShell.NameSpace(ssfSysDir);
if (objFolder2 != null)
{
    var objFolderItem;
    objFolderItem = objFolder2.ParseName("mspaint.exe");
    if (objFolderItem != null)
    {
        propVal = objFolderItem.ExtendedProperty("{0CEF7D53-FA64-11D1-A203-0000F81FEDEE},6");
        WScript.Echo(propVal);
    }
}