Windows entspricht dem Unix-Befehl "stat"?

3973
SamB

Ich suche also nach einem Kommandozeilenansatz, um einen kurzen (ish) Textauszug relativ niedriger Metadaten für eine Datei zu erhalten, etwa auf dieselbe Weise statwie auf * nix-Systemen.

Mit anderen Worten, Informationen, die über Win32- oder NT-Datei-APIs leicht verfügbar sind, ohne den Inhalt der Datei zu lesen und auf jeden Fall ohne sich in der Nähe der Shell befinden zu müssen (wie im Explorer und in den Dialogfeldern "Speichern / Öffnen" und bei allen anderen Anwendungen shell32.dll).

Unter NTFS würde diese Information tendenziell im MFT-Eintrag der Datei gespeichert werden, obwohl ich gehört habe, dass genau die Attribute, die in der MFT-Datei enden, weitgehend davon abhängen, zu welchem ​​Teil sie passen wird, da viele Attribute optional und wiederholbar sind / oder variable Größe, einige können sein, obwohl es auch möglich ist, mehr als einen Slot in der MFT zu verwenden. (Tatsächlich ist es sogar möglich, den gesamten Inhalt einer Datei / eines Verzeichnisses in der MFT zu speichern, wenn die anderen Attribute nicht zu viel Platz beanspruchen!) Also, ähm, offensichtlich erscheint "in der MFT" nicht zur Definition was ich suche.

Außerdem suche ich nicht nach Tools, die NTFS selbst parsen oder nur mit NTFS-Dateisystemen arbeiten: Ich erwähne nur NTFS, denn welche lokale FS unterstützt mehr NT-spezifische Dinge?

Zur Verdeutlichung hier statdie Debian-Box, die ich als Router verwende:

hydrogen% stat . File: ‘.’ Size: 4096 Blocks: 8 IO Block: 4096 directory Device: fe00h/65024d Inode: 507974 Links: 4 Access: (0755/drwxr-xr-x) Uid: ( 1000/ naesten) Gid: ( 1000/ naesten) Access: 2016-08-31 14:12:47.650440935 -0400 Modify: 2016-09-20 17:26:15.935591584 -0400 Change: 2016-09-20 17:26:15.935591584 -0400 Birth: - hydrogen% 

Und hier ist der von Git für Windows:

farbige Rasterversion von "Screenshot"

Sam@Sam-laptop MINGW64 ~ $ git --version git version 2.8.2.windows.1  Sam@Sam-laptop MINGW64 ~ $ stat . File: '.' Size: 0 Blocks: 32 IO Block: 65536 directory Device: 147ac391h/343589777d Inode: 1970324836977201 Links: 1 Access: (0755/drwxr-xr-x) Uid: (197608/ Sam) Gid: (197121/ UNKNOWN) Access: 2016-09-18 18:32:28.072538600 -0400 Modify: 2016-09-18 18:32:28.072538600 -0400 Change: 2016-09-18 18:32:28.072538600 -0400 Birth: 2014-08-21 18:52:08.217444400 -0400  Sam@Sam-laptop MINGW64 ~ $ 

An diesem Punkt war ich werde sagen, dass das „Geburt“ Zeitstempel - Feld ein Windowsism ist, aber das ist eindeutig nicht ganz richtig, weil Debians stat das Feld zeigt, nur dann ist es leer oben, weil das Dateisystem tatsächlich nicht das Feld hat. (Was zumindest klarer ist als die Zeitstempel "Access": Kein System aktualisiert diese auf herkömmliche strictatimeWeise.)

Beachten Sie auch, wie der Windows-Port Dateizugriffsberechtigungen anzeigt, eine unplausibel große "Inode-Nummer", und ich kann nur davon ausgehen, dass es sich auch um UID / GID-Nummern handelt (aufgrund der Verwendung von hierarchischen Bezeichnern mit variabler Länge Anstatt Zahlen mit fester Größe zu identifizieren, um Benutzer und Gruppen zu identifizieren, und erlaubt nicht gleichzeitig den Besitz von Benutzern und Gruppen, dh, unter NT befindet sich eine Datei im Besitz eines einzelnen Benutzers ODER einer Gruppe, und alle anderen Benutzer erhalten nur ihre Rechte von der ACL).

Bietet MS ein Instrument dieser Art, vermutlich eines, das aktuellere Informationen und weniger Märchenlandinformationen anzeigt?


Mein ursprünglicher Text folgt:

Ja, ich weiß, dass es Häfen von gibt stat, aber ( a ) ich befürchte, dass Informationen durch die Risse fallen könnten, wenn:

  1. Es erscheint normalerweise nicht in der Unix- statAusgabe
  2. Es fehlt aus statirgendeinem Code des Upstreams (falls vorhanden)
  3. Der Portier (s) entweder
    1. Beachten Sie nicht, dass Windows die Informationen bereitstellt
    2. Bauen auf einer POSIX-Schicht auf, die sie nicht durchlässt
    3. Sie sind sich nicht sicher, wie Sie die Informationen am besten im Kontext von präsentieren können (oder dass dies sogar angemessen ist) stat
    4. Sie haben keine unbegrenzte Zeit zur Verfügung

und ( b ) ich habe mich gefragt, ob Microsoft irgendwelche analogen Werkzeuge geliefert hat.

Aber wirklich, jede Befehlszeilenmethode, die Informationen statliefert (unabhängig davon, ob es sich um ein aufgerufenes Programm handelt stat) könnte zusammen mit einer Beschreibung der mehr oder weniger NTFS-spezifischen Informationen, die es bereitstellt, von Interesse sein.

PS Ich bin unter Windows 7, aber lassen Sie sich davon nicht abhalten, Dinge zu erwähnen, die zuerst für / in späteren Versionen von Windows ausgeliefert wurden.

3
Mögliches Dupe: [Informationen zu einer Datei oder einem Verzeichnis] ​​(https://superuser.com/q/242307) DavidPostill vor 8 Jahren 1
Werfen Sie einen Blick auf http://ss64.com/vb/filesystemobject.html, wenn Sie eine Chance haben. Vielleicht finden Sie es auch hilfreich. Pimp Juice IT vor 8 Jahren 0
Sehr geehrte Damen und Herren, wenn Sie denken, dass * meine * Frage zu weit gefasst ist, schauen Sie sich den DavidPostill-Link an: Er besteht aus vier Overt-Teilen, und zwei suchen nach Linux * - und * Windows 7-Antworten. SamB vor 8 Jahren 0
Sowohl [WSL] (https://blogs.msdn.microsoft.com/wsl/2016/06/15/wsl-file-system-support/) als auch Cygwin verwenden [NTFS fileID] (https://stackoverflow.com/ q / 44162664/995714) als Inode-Nummer, die leicht zu überprüfen ist. Wenn wir 1970324836977201 in Hex konvertieren, erhalten Sie 0x7000000000A31, die nur über wenige gesetzte Bits verfügt. OTOH [* Bei Dateisystemen, die keine eindeutigen beständigen Datei-IDs (FAT, ältere Samba-Freigaben) unterstützen, wird die Inode-Nummer für eine Datei durch Hashing des vollständigen Win32-Pfads berechnet. *] (Http://cygwin.com/cygwin- ug-net / cygwin-ug-net.pdf) phuclv vor 6 Jahren 0

4 Antworten auf die Frage

4
Ben N

Ich habe gerade ein PowerShell-Skript zusammengeschmissen. Es enthält so ziemlich alles, was für Windows sinnvoll ist, mit Ausnahme der Zugriffskontrollen, die normalerweise zu groß sind, um in eine Zusammenfassung zu passen. Sie können sie mit dem icaclsDienstprogramm sehen.

$obj = $args[0] If ($obj.GetType().Name -eq 'String') {$obj = gi $obj} 'File: ' + $obj.FullName 'Size: ' + $obj.Length $extents = [string](fsutil file queryextents "$($obj.FullName)") If (-$extents.StartsWith('i')) { 'Clusters: ' + ($extents.Substring(26) -split 'LCN')[0] 'LCN: ' + $extents.Substring(42) } Else { 'Clusters: stored in file table' } 'Attributes: ' + $obj.Attributes $volumeinfo = (fsutil fsinfo volumeinfo "$([System.IO.Path]::GetPathRoot($obj.FullName)[0] + ':')") $volumeinfo | ? {$_.StartsWith('Volume Serial')} | % {$_.Replace(' :', ':')} $fileid = (fsutil file queryfileid "$($obj.FullName)") 'File ID: ' + $fileid.Substring(11) $links = (fsutil hardlink list "$($obj.FullName)") 'Links: ' + ([string[]]$links).Length 'Owner: ' + $obj.GetAccessControl().Owner '' 'Access: ' + $obj.LastAccessTime 'Modify: ' + $obj.LastWriteTime 'Create: ' + $obj.CreationTime '' # Extra blank line for readability 

Es verwendet die normalen Eigenschaften des .NET / PowerShell-Dateisystems und ruft das fsutilHilfsprogramm für die kniffligen Dinge auf. Da es sich bei diesem Dienstprogramm nicht um ein PowerShell-Cmdlet handelt, musste ich einige unordentliche String-Hacks ausführen, um die richtigen Informationen zu erhalten.

Speichern Sie es als .ps1Datei und lesen Sie den Abschnitt Aktivieren von Skripts des PowerShell-Tag-Wikis . Beispiel für die Ausgabe:

File: C:\Users\Ben\test\blank.ps1 Size: 8 Clusters: stored in file table Attributes: Archive Volume Serial Number: 0x9c67b42c File ID: 0x0000000000000000000700000014428b Links: 1 Owner: POWERSHELL\Ben  Access: 07/29/2016 20:01:25 Modify: 07/29/2016 20:02:43 Create: 07/29/2016 20:01:25 
2
phuclv

Es gibt kein genaues Äquivalent, aber der nächstgelegenefsutil Befehl, den Sie mit den integrierten Windows-Dienstprogrammen erhalten können, ist der Befehl . Sie erhalten die meisten Funktionen und statdetailliertere Informationen zur zugrunde liegenden Dateisystemstruktur. Im Gegensatz statdazu muss es unter Administratorrechten ausgeführt werden. Sie können auch wmic (oder die Get-WmiObject( gwmiAlias) PowerShell-Version) für viele nützliche Daten verwenden. Für einige andere Optionen benötigen Sie andere Befehle

Im Folgenden erfahren Sie, wie Sie analoge Informationen zu den Formatoptionen instat (in PowerShell mit cmd-Version, falls verfügbar) erhalten, mit denen Sie die Ausgabe anpassen können. Ansonsten Dump nur die fsutil file layout, fsutil fsinfo sectorinfound fsutil fsinfo ntfsinfodirekt ausgegeben

  • Zugriffsrechte: Windows-Zugriffsrechte unterscheiden sich stark von POSIX-Zugriffsrechten. Daher gibt es keine Analoge zu % a . Es gibt jedoch ähnliche Informationen

  • Anzahl der zugewiesenen Blöcke ( % b ): Führen Sie die Anzahl fsutil file layout path\to\fileoder fsutil volume filelayout path\to\filedie Anzahl der im $DATAStream zugewiesenen Cluster aus .

    Für die folgende Ausgabe haben wir beispielsweise 4 Bereiche zugewiesen, die jeweils 82, 432,419, 259 und 155,076 Cluster lang sind. Folglich ist die Anzahl der zugewiesenen Blöcke 82 + 432419 + 259 + 155076 = 587836. Ein schneller Trick besteht darin, die VCN-Nummer des letzten Clusters mit seiner Länge hinzuzufügen: 432760 + 155076 = 587836

    Stream : 0x080 ::$DATA Attributes : 0x00000000: *NONE* Flags : 0x00000000: *NONE* Size : 2.407.772.410 Allocated Size : 2.407.776.256 Extents : 4 Extents : 1: VCN: 0 Clusters: 82 LCN: 1.620.482 : 2: VCN: 82 Clusters: 432.419 LCN: 5.331.392 : 3: VCN: 432.501 Clusters: 259 LCN: 3.230.067 : 4: VCN: 432.760 Clusters: 155.076 LCN: 9.299.239 
  • Die Größe in Bytes jedes Blocks, die von% b ( % B ) gemeldet wird :

    fsutil fsinfo ntfsinfo <drive> | findstr /c:"Bytes Per Cluster"` 
  • SELinux-Sicherheitskontextzeichenfolge ( % C ): Keine vergleichbare Funktion

  • Gerätenummer ( % d, % D ): Kein ähnliches Gegenstück. Sie können jedoch den folgenden Befehl verwenden, wenn Sie die Geräte-ID abrufen möchten

    (Get-WmiObject win32_volume | where { $_.driveletter -eq '<drive>' }).deviceid 
  • Rohmodus in Hex ( % f ): Keine äquivalente Form. Siehe% a /% A oben

  • Dateityp ( % F ): Keine direkte Entsprechung, da Windows-Datei- und Treibermodelle sehr unterschiedlich sind und es keine ähnlichen Zeichengeräte wie Windows gibt, so dass Sie keine "Character Special File" erhalten. Im Allgemeinen können Sie jedoch verwenden (ls path\to\file).Mode, um den Dateimodus wie oben% A (ls path\to\file).LinkTypezu erhalten, und um den Linktyp zu erhalten

  • Gruppenname des Eigentümers ( % G ):

    (Get-Acl file.ext).Group 
  • Gruppennummer des Besitzers ( % g ):

    (gwmi win32_useraccount | where { $_.caption -eq "$((Get-Acl file.ext).Group)" }).SID 
  • Anzahl der festen Links ( % h ): Es gibt keine ähnlichen Informationen. Es werden jedoch fsutil hardlink list path\to\filealle harten Links einer Datei gedruckt, sodass wir sie problemlos zählen können

    (fsutil hardlink list path\to\file | Measure-Object).Count 
    • Alternativ verwenden (fsutil file layout path\to\file | sls -CaseSensitive -Pattern '^Link.+\s+:\s+0x[0-9a-f]+:\s*HLINK Name\s+:' | Measure-Object).Count
  • Inode-Nummer ( % i ): Es gibt keinen Inode in Windows, aber NTFS (und möglicherweise neuere Dateisysteme wie ReFS) verfügen über eine entsprechende Datei-ID, die aus der fsutil file layoutAusgabe oder direkt mit extrahiert werden kann

    fsutil file queryfileid path\to\file 
  • Dateiname ( % n ): Dies ist ziemlich offensichtlich

  • Zitierter Dateiname mit Dereferenzierung bei symbolischem Link (% N):

  • E / A-Blockgröße ( % o ): Siehe % s für Dateisysteme unten

  • Gesamtgröße in Byte ( % s ): (ls path\to\file).Length. Oder kann leicht in der dirAusgabe von cmd und in der fsutil file layout path\to\fileAusgabe unter dem SizeFeld wie oben gesehen werden

  • Gerätetyp ( % t, % T ): Siehe % T für den Dateisystemtyp unten

  • Benutzername des Besitzers ( % U ):

    (Get-Acl path\to\file).Owner 
  • Benutzer-ID des Besitzers ( % u ): Sie können die Benutzer-SID mit dem folgenden Befehl abrufen

    (gwmi win32_useraccount | where { $_.caption -eq "$((Get-Acl D:\zz.bat).owner)" }).SID 
  • Dateizeit:

    • Letzte Zugriffszeit ( % x ):(ls path\to\file).LastAccessTime
    • So erhalten Sie die letzte Zugriffszeit seit Epoche ( % X ): (ls path\to\file).LastAccessTime.Ticksoder (ls path\to\file).LastAccessTime.ToFileTime()(abhängig von der gewünschten Epoche: 1/1/0001 oder 1/1/1601), um die Dateizeit in einer Auflösung von 100 ns zu erhalten
    • Ebenso kann der letzte Änderungszeitpunkt ( % y, % Y ) mit abgerufen werdenLastWriteTime
    • Das Abrufen der letzten Metadatenänderungszeit ( % z, % Z ) ist schwieriger und Sie müssen möglicherweise Win32-APIs von PowerShell aus aufrufen

Für Dateisysteme können Sie im Allgemeinen fsutil fsinfo ntfsinfo <drive>oder verwenden fsutil fsinfo sectorinfo <drive>, um detaillierte Informationen zu erhalten

  • Für Nicht-Superuser verfügbare freie Blöcke ( % a ): Keine Entsprechung. Aber ich denke, du kannst es mit überprüfenfsutil quota query
  • Gesamtdatenblöcke im Dateisystem ( % b ):

    fsutil fsinfo ntfsinfo <drive> | findstr /c:"Number Sectors" 
  • Gesamtanzahl der Dateiknoten im Dateisystem ( % c ): Wenn es sich um die Anzahl der Inodes handelt, gibt es keine Begrenzung für MFT-Datensätze für NTFS sowie viele neuere Linux-Dateisysteme wie Btrfs oder XFS. Die MFT-Dateigröße wird erhöht, um mehr Dateisätze zu speichern. Die Gesamtzahl der MFT-Datensätze kann mit überprüft werdenfsutil fsinfo ntfsinfo <drive>

  • Freie Dateiknoten im Dateisystem ( % d ): Nicht sicher, was das ist. Wenn es sich um die Anzahl der nicht verwendeten Inodes handelt, gibt es, wie oben erwähnt, im Allgemeinen keine Obergrenze. fsutil volume allocationreport <drive>Wird möglicherweise funktionieren

  • Freie Blöcke im Dateisystem ( % f ):

    • fsutil fsinfo ntfsinfo <drive> | findstr /c:"Free Clusters"
    • Detailliertere Informationen finden Sie unter fsutil volume allocationreport <drive>
  • Dateisystem-ID in Hex ( % i ): Ich weiß nicht, was genau unter Windows genau ist, aber diese Informationen können diese Informationen liefern

    fsutil fsinfo ntfsinfo <drive> | findstr /c:"Resource Manager Identifier" /c:"NTFS Volume Serial Number" (gwmi win32_volume | where { $_.driveletter -eq 'd:' }).serialnumber` 
  • Maximale Länge von Dateinamen ( % l ):

    (gwmi win32_volume | where { $_.driveletter -eq <drive> }).maximumfilenamelength 
  • Blockgröße (für schnellere Übertragungen) ( % s ):

    fsutil fsinfo sectorinfo <drive> | findstr /c:"Performance" 
  • Grundlegende Blockgröße (für Blockzählungen) ( % S ):

    fsutil fsinfo sectorinfo <drive> | sls physical fsutil fsinfo ntfsinfo <drive> | sls physical (gwmi win32_volume | where { $_.driveletter -eq 'd:' }).blocksize 
  • Typ: Für % T können Sie verwenden fsutil fsinfo volumeinfo <drive> | findstr /c:"File System Name". Ich bin nicht sicher, was % t ist, aber es scheint, dass dies die magische Zahl der Partition ist

Die (Get-WmiObject win32_ALIAS | where { $_.FILTERFIELD -eq 'VALUE' }).GETFIELDobigen Befehle können in geändert werden wmic ALIAS where FILTERFIELD='VALUE' get GETFIELD /value. wmicWurde jedoch als veraltet eingestuft, kann es in Zukunft entfernt werden

1
bshacklett

Get-Item /path/to/file | Format-List Sie sollten nur das bekommen, was Sie brauchen, wenn Sie nur native Cmdlets verwenden.

Get-ItemRuft die Details zu allen Dateien ab, an denen Sie interessiert sind. Format-ListDadurch werden dem PowerShell-Host etwas unbeabsichtigt mehr Parameter verfügbar gemacht, als dies ansonsten der Fall wäre. Es formatiert sie auch als Liste, als Sie würden erwarten.

 ~> Get-Item ./temp.txt | Format-List   Directory: /Users/brianshacklett   Name : temp.txt Length : 989 CreationTime : 4/5/18 9:52:04 PM LastWriteTime : 4/5/18 9:52:04 PM LastAccessTime : 6/26/18 7:58:18 PM Mode : ------ LinkType : Target : VersionInfo : File: /Users/brianshacklett/temp.txt InternalName: OriginalFilename: FileVersion: FileDescription: Product: ProductVersion: Debug: False Patched: False PreRelease: False PrivateBuild: False SpecialBuild: False Language: 

Wenn die Ausführlichkeit Sie stört, können Sie dies mit Aliasnamen verkürzen gi /path to file | fl

Es ist interessant zu beachten, dass auf Ihrem Computer `CreationTime == LastWriteTime` und auf meinem Computer` CreationTime == LastAccessTime` ist. Das lässt mich bezweifeln, dass * AccessTime * überhaupt Gültigkeit hat. not2qubit vor 5 Jahren 0
0
Seth

Das Tool, das Sie verwenden, verwendet eine Umgebung, die als dünne Schicht zwischen Windows und Linux fungiert und bestimmte Elemente nachahmen muss, damit Linux-Tools ihre Aufgabe erfüllen können. Dies erklärt, warum es fabrizierte Informationen gibt, die (hoffentlich) in einer konsistenten Angelegenheit zusammenpassen. Sie müssen sich die Besonderheiten der Umgebung ansehen, die sie implementiert, um einen Sinn daraus zu machen.

Andererseits ist es (für mich) nicht genau klar, wonach Sie suchen. Wie Sie sagten, gibt es verschiedene APIs, die Sie nicht verwenden möchten. Ist nur die "emulierte" Information für Sie relevant?

Ansonsten benötigen Sie wahrscheinlich eine Reihe von Tools, um alle Informationen zu erhalten, die Sie benötigen. Zugriffsrechte und Zugriffssteuerungslisten sind meines Wissens nach sehr tief in NTFS verwurzelt. Tools wie diese icalcskönnten Ihnen helfen, Informationen zu den Zugriffsrechten auf Kommandozeile zu erhalten. Um genauere Informationen (für Teile davon) zu erhalten, sollten Sie WMI in Betracht ziehen, wie in diesem Beispiel gezeigt . Eine einfache diroder get-childitemvon einer PowerShell erhält Sie möglicherweise mehr Informationen zu den Erstellungszeiten und dergleichen. Ich kenne keine eingebauten Tools, mit denen Sie all diese Informationen aufgeben können. Möglicherweise verwenden Sie die Informationen zu den APIsund wickeln Sie sie in ein PowerShell-Skript ein. Dies könnte dem nahe kommen, was Sie eigentlich tun möchten. Ich bin mir nicht sicher, ob es ein Skript gibt, das das schon macht.

Ja, ich habe eine ungefähre Vorstellung davon, wie Windows-Ports von stat funktionieren. Es stellt sich heraus, dass MSYS2 verwendet wird. Zu dem, was ich wollte, war ich neugierig, ob MS bereits ein ungefähr analoges Tool gebaut hatte, vielleicht in einem ihrer vielen "Kits", oder dass es ein bekanntes Freeware-Tool von Drittanbietern gab. Und es ist nicht so, dass ich * mich * weigere *, APIs oder irgendetwas zu verwenden, es ist nur mehr Arbeit. (Wie auch immer, wenn das mein Ziel * wäre, hätte ich nach den APIs für SO gefragt.) SamB vor 8 Jahren 0
Oder zumindest wäre SO der Ort gewesen, an dem ich nach den APIs gefragt hätte: Ich vermute, dass die Frage, die Sie verlinkt haben, [Was ist lstat () Alternative in Windows?] (Http://stackoverflow.com/questions/ 12085761 / what-is-lstat-alternative-in-windows) wäre mir aufgefallen, als ich an meinem Titel arbeitete, wenn nicht vorher. (Huh, das Feature "Titel einer verknüpften Frage anzeigen" funktioniert nicht nur in Kommentaren, anscheinend auch nicht mit der `<>" - Notation?). SamB vor 8 Jahren 0
... obwohl es nicht so gut beantwortet ist ... SamB vor 8 Jahren 0