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)
„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
Ale to zbyt łatwe. Lubię wyzwania. Pytanie jest edytowane za pomocą cscript. –
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 –