2012-11-18 38 views
5

Ponieważ node.js nie oferuje sposobu na pobieranie i modyfikowanie atrybutów plików w systemie Windows, należy wykonać proces potomny. Chcę uzyskać wszystkie atrybuty plików, czyli:Pobieranie atrybutów plików z systemu Windows cmd

  • rozmiar
  • Archiwum
  • ukryty
  • readonly
  • System
  • tworzenie/modyfikować/dostęp czasowy
  • plik /? katalog?/symlink? (skrzyżowanie)

Jeśli mam zamiar wykonać proces potomny, nie chcę wywoływać fs.stat, ponieważ jest to dodatkowy dostęp we/wy (a statystyki nie oferują zbyt wielu informacji o oknach). Jeśli wykonuję proces potomny, chcę pobrać wszystkie dane naraz.

Więc pisałem skrypt powershell:

var cmd = "powershell -Command \"$item=get-item a -force;[bool]($item.attributes -band [io.fileattributes]::directory);[bool]($item.attributes -band [io.fileattributes]::archive);[bool]($item.attributes -band [io.fileattributes]::reparsepoint);[bool]($item.attributes -band [io.fileattributes]::hidden);[bool]($item.attributes -band [io.fileattributes]::readonly);[bool]($item.attributes -band [io.fileattributes]::system);$item.length;$tmp=$item.creationtime;$tmp.year;$tmp.month;$tmp.day;$tmp.hour;$tmp.minute;$tmp.second;$tmp.millisecond;$tmp=$item.lastaccesstime;$tmp.year;$tmp.month;$tmp.day;$tmp.hour;$tmp.minute;$tmp.second;$tmp.millisecond;$tmp=$item.lastwritetime;$tmp.year;$tmp.month;$tmp.day;$tmp.hour;$tmp.minute;$tmp.second;$tmp.millisecond;$s\""; 

Powrócisz: (raz został podzielony w javascript: split("\r\n"))

[ 'False', //directory? 
    'True', //archive? 
    'False', //symlink? 
    'False', //hidden 
    'False', //readonly? 
    'False', //system? 
    '3', //length (if directory, empty string) 
    '2012', //creation time, year 
    '11', //creation time, month 
    '18', //creation time, day 
    '6', //creation time, hour 
    '8', //creation time, min 
    '44', //creation time, ysec 
    '457', //creation time, millis 
    '2012', //last access time, year... 
    '11', 
    '18', 
    '6', 
    '8', 
    '44', 
    '457', 
    '2012', //last modified time, year... 
    '11', 
    '18', 
    '14', 
    '0', 
    '38', 
    '859', 
    '' ] 

Problem polega na tym, że Windows XP nie chodź z powershell i musisz go zainstalować (btw, który używa Windows XP z node.js w dzisiejszych czasach? głupio), więc szukam polecenia cmd, które może pobrać te same informacje. Widziałem, że dir może pokazać wszystko, czego potrzebuję, ale nie pokazuje sekundy i milisekundy i nie znalazłem sposób, aby określić, czy plik jest dowiązaniem ...


EDIT: rozwiązanie wydaje się być w Hosta skryptów systemu Windows. Dostępne od Windows 98 i skrypty są pisane w javascript.

rozwiązanie:

systemu Windows Script Host w JScript:

whs.js

var fs = new ActiveXObject ("Scripting.FileSystemObject"); 
var name = WScript.Arguments.item (0); 
var file; 
try{ 
    file = fs.getFile (name); 
}catch (e){ 
    file = fs.getFolder (name); 
} 
//http://msdn.microsoft.com/en-us/library/windows/desktop/gg258117%28v=vs.85%29 
//-1 if true, 0 if false 
WScript.echo (!!(file.attributes & 1)); //Read-only 
WScript.echo (!!(file.attributes & 2)); //Hidden 
WScript.echo (!!(file.attributes & 4)); //System 
WScript.echo (!!(file.attributes & 16)); //Directory 
WScript.echo (!!(file.attributes & 32)); //Archive 
WScript.echo (!!(file.attributes & 1024)); //Reparse point (symbolic link) 
WScript.echo (file.size); //0 if directory 
WScript.echo (file.dateCreated); 
WScript.echo (file.dateLastAccessed); 
WScript.echo (file.dateLastModified); 

node.js:

var file = "a"; 
require ("child_process").exec ("cscript " + __dirname + 
     "/wsh.js " + file + " //Nologo", 
     function (error, stdout, stderr){ 
      if (error) return console.log (error); 
      if (stderr) return console.log (stderr); 
      stdout = stdout.split ("\r\n"); 
      console.log(stdout) 
}); 

Wynik:

[ '0', 
    '0', 
    '0', 
    '0', 
    '-1', 
    '0', 
    '3', 
    '18/11/2012 15:45:04', 
    '18/11/2012 15:45:04', 
    '18/11/2012 15:45:12', 
    '' ] 

milisekundy nie może zostać odzyskane, ale jest ok (linux czas dostepu nie mają ms)

+0

„Problemem jest to, że Windows XP nie pochodzi z PowerShell i trzeba go zainstalować” tak to jest chcesz * wdrożyć * to na wielu maszynach, gdzie dodatkowa zależność byłaby tylko problem problem. Wydaje się to dziwnym problemem. Po prostu określ PowerShell jako wymaganie. – Richard

+1

Ale to zbyt łatwe. Lubię wyzwania. Pytanie jest edytowane za pomocą cscript. –

+0

Mniej zależności jest zawsze dobrą rzeczą. Dzięki Twojemu rozwiązaniu stworzyłem moduł, który pobiera i ustawia atrybuty pliku/katalogu: https://www.npmjs.org/package/winattr –

Odpowiedz

2

Już odpowiedział siebie.Ale istnieje sposób, aby przeczytać jakiś plik attributes with a batch file:

c:\>for /f %A in ("example.file") do echo %~aA 

od w skrypcie:

for /f %%A in ("example.file") do echo %%~aA 

lub ATTRIB:

c:\>attrib + semitest.bat /s /d 

gdzie ATUTY to:

R Read-only (1) 
    H Hidden (2) 
    A Archive (32) 
    S System (4) 

przedłużony atrybutu tes:

E Encrypted 
    C Compressed (128:read-only) 
    I Not content-indexed 
    L Symbolic link/Junction (64:read-only) 
    N Normal (0: cannot be used for file selection) 
    O Offline 
    P Sparse file 
    T Temporary 
Powiązane problemy