2012-11-18 10 views
5

Poiché node.js non offre un modo per recuperare e modificare gli attributi di file su Windows, è necessario eseguire un processo figlio. Voglio ottenere tutti gli attributi di file, vale a dire:Recupera attributi file da windows cmd

  • dimensioni
  • archivio
  • nascosto
  • sola lettura
  • sistema
  • creazione/modifica/accesso in tempo
  • file /? directory?/link simbolico? (svincolo)

Se ho intenzione di eseguire un processo figlio, non voglio chiamare fs.stat perché è un accesso I/O extra (e Stats non offre troppe informazioni su Windows). Se eseguo un processo figlio, desidero recuperare tutti i dati contemporaneamente.

Così, ho scritto uno script 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\""; 

Ciò restituisce: (una volta è stato diviso in 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', 
    '' ] 

Il problema è che Windows XP non lo fa vieni con powershell e devi installarlo (btw chi usa windows xp con node.js al giorno d'oggi? sciocco), quindi sto cercando un comando cmd in grado di recuperare le stesse informazioni. Ho visto che dir può mostrare tutto quello che ho bisogno, ma non mostra secondi e millesimi di secondo e non ho trovato un modo per determinare se un file è un collegamento simbolico ...


EDIT: La soluzione sembra essere in Windows Script Host. Disponibile da Windows 98 e gli script sono scritti in javascript.

SOLUZIONE:

di Windows Script Host in 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) 
}); 

Risultato:

[ '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', 
    '' ] 

millisecondi non possono essere recuperati, ma è ok (Linux atime, mtime non hanno ms)

+0

"Il problema è che Windows XP non viene fornito con PowerShell ed è necessario installarlo", in modo che è solo un problema è che si desidera * distribuire * presente su più macchine in cui una dipendenza aggiuntivo sarebbe un problema. Questa sembra una strana preoccupazione. Basta specificare PowerShell come requisito. – Richard

+1

Ma è troppo facile. Mi piacciono le sfide. La domanda è modificata con un cscript. –

+0

Meno dipendenze è sempre una buona cosa. Grazie alla tua soluzione, ho creato un modulo che ottiene e imposta gli attributi di file/dir: https://www.npmjs.org/package/winattr –

risposta

2

È già da soli una risposta.Ma c'è un modo di leggere alcuni file di attributes with a batch file:

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

di in uno script batch:

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

o con ATTRIB:

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

dove i atributes sono:

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

attributo esteso 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