2012-11-18 17 views
5

से फ़ाइल विशेषताओं को पुनर्प्राप्त करें क्योंकि node.js विंडोज़ पर फ़ाइल विशेषताओं को पुनर्प्राप्त करने और संशोधित करने का कोई तरीका नहीं प्रदान करता है, मुझे एक बच्चे की प्रक्रिया निष्पादित करने की आवश्यकता है। मैं सभी फ़ाइल विशेषताओं प्राप्त करना चाहते हैं, वह है:विंडोज सेमीडी

  • आकार
  • संग्रह
  • छिपा
  • केवल पढ़ने के लिए
  • प्रणाली
  • निर्माण/संशोधित/उपयोग समय
  • फ़ाइल /? निर्देशिका?/सिमलिंक? (जंक्शन)

यदि मैं एक बाल प्रक्रिया निष्पादित करने जा रहा हूं, तो मैं fs.stat पर कॉल नहीं करना चाहता क्योंकि यह एक अतिरिक्त I/O पहुंच है (और आंकड़े विंडोज़ पर बहुत अधिक जानकारी नहीं देते हैं)। अगर मैं एक बाल प्रक्रिया निष्पादित करता हूं तो मैं एक ही समय में सभी डेटा पुनर्प्राप्त करना चाहता हूं।

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\""; 

यह रिटर्न: (एक बार जावास्क्रिप्ट में splitted कर दिया गया है 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', 
    '' ] 

समस्या यह है कि विंडोज़ XP नहीं है

तो, मैं एक powershell स्क्रिप्ट लिखा है पावरहेल के साथ आओ और आपको इसे स्थापित करने की आवश्यकता है (बीटीडब्ल्यू जो आजकल xode के साथ windows xp का उपयोग कर रहा है? मूर्खतापूर्ण), इसलिए मैं एक cmd कमांड खोज रहा हूं जो एक ही जानकारी को पुनर्प्राप्त कर सकता है। मैंने देखा है कि dir सब मैं की जरूरत है दिखा सकते हैं, लेकिन यह सेकंड और मिलीसेकेंड प्रदर्शित नहीं करता है और मैं अगर एक फाइल एक सिमलिंक है निर्धारित करने के लिए एक तरह से नहीं मिला है ...


संपादित करें: समाधान विंडोज स्क्रिप्ट होस्ट में प्रतीत होता है। विंडोज 98 के बाद से उपलब्ध है और स्क्रिप्ट जावास्क्रिप्ट में लिखी गई हैं।

समाधान:

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) 
}); 

परिणाम:

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

मिलीसेकंड लिया गया नहीं किया जा सकता लेकिन यह ठीक है (linux atime, mtime एमएस नहीं है)

+0

"समस्या यह है कि विंडोज़ XP powershell के साथ नहीं आता है और आप इसे स्थापित करने की आवश्यकता" इतना है कि केवल एक समस्या आप * * इसे एक से अधिक मशीनों जहां एक अतिरिक्त निर्भरता होगा को तैनात करना चाहते है एक समस्या। यह एक अजीब चिंता प्रतीत होता है। आवश्यकता के रूप में बस PowerShell निर्दिष्ट करें। – Richard

+1

लेकिन यह बहुत आसान है। मुझे चुनौतियों को पसंद है। प्रश्न एक सीएसक्रिप्ट के साथ संपादित किया गया है। –

+0

कम निर्भरता हमेशा एक अच्छी बात है। आपके समाधान के लिए धन्यवाद, मैंने एक मॉड्यूल बनाया है जो फ़ाइल/डीआईआर विशेषताओं को प्राप्त करता है और सेट करता है: https://www.npmjs.org/package/winattr –

उत्तर

2

आप पहले से ही अपने आप को जवाब दे दिया।

c:\>for /f %A in ("example.file") do echo %~aA 
एक बैच लिपि में की

:: लेकिन वहाँ कुछ फ़ाइल attributes with a batch file पढ़ने के लिए एक रास्ता है

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

या ATTRIB साथ:

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

जहां गुण हैं:

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

विस्तारित attribu ट:

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