2013-08-12 8 views
5

में वर्तमान कार्य निर्देशिका को कैसे बदलें, अब मैं दूसरे के इंटरफ़ेस को आमंत्रित करने के लिए एक ग्रोवी स्क्रिप्ट लिख रहा हूं। लेकिन स्क्रिप्ट चलाने के दौरान मुझे अपने वर्तमान कार्य पथ को बदलने की जरूरत है। मुझे पता है कि जावा में यह संभव नहीं है। क्या ग्रोवी में यह संभव है?ग्रोवी

उत्तर

6

जैसा कि ग्रोवी जेवीएम पर चलता है, वही प्रतिबंध लागू होते हैं। दुर्भाग्य से यह संभव नहीं है।

def processBuilder=new ProcessBuilder(command) 
processBuilder.directory(new File("Working dir")) 
def process = processBuilder.start() 

या

command.execute(null, new File("Working dir")) 

ताकि प्रक्रिया:

Changing the current working directory in Java?

JDK bug

+0

कल मैं Stackoverflow पर खोज करते हैं, यह इस तरह से काम कर सकते हैं? 'शून्य setCurrentDirectory (new_dir_path) { \t System.setProperty (" user.dir ", new_dir_path) }' – Joe

+0

@Joe कोई ऐसा नहीं होगा, मैंने जुड़े जावा प्रश्न को पढ़ें। –

+0

हाँ। मैंने परीक्षण किया है, यह नहीं होगा। धन्यवाद। – Joe

4

आप अलग प्रक्रिया के रूप में अन्य स्क्रिप्ट चला सकते हैं, तो आप ProcessBuilder पैरामीटर काम कर dir दे सकते हैं आपके नए फ़ोल्डर में स्विच करेगा और इसे वहां निष्पादित करें।

1

जावा/ग्रोवी वास्तव में एक कार्यशील निर्देशिका नहीं है जहां तक ​​मैं कह सकता हूं। जिस शेल ने ग्रोवी लॉन्च किया है वह एक है और किसी भी बच्चे को "कमांड" उस शेल से सीधे प्राप्त होता है।

जावा भी खोल की वर्तमान निर्देशिका को पढ़ता है और इसे "user.dir" में संग्रहीत करता है। इसे "फ़ाइल" ऑब्जेक्ट के लिए आधार के रूप में उपयोग किया जाता है, इसलिए यदि आप System.setProperty ("user.dir", "c:/windows") है तो यह नई फ़ाइल ("।") के भविष्य के इनवॉशंस को बदल देगा लेकिन बदलेगा नहीं अभिभावक खोल निर्देशिका (और इसलिए बाल निर्देशिका नहीं)।

1) मैं प्रकार की एक विशेष कार्य के लिए इस पर विजय ... मैं लागू करने के लिए एक ग्रूवी स्क्रिप्ट के रूप में "cd" चाहता था:

यहाँ तीन "काम arounds" कि विभिन्न परिदृश्यों के लिए काम कर सकते हैं कर रहे हैं। यह केवल इसलिए संभव था क्योंकि मेरी सभी स्क्रिप्ट पहले से ही बैच फ़ाइल में "लपेटा" जा रही थीं। मैंने इसे बनाया ताकि मेरी स्क्रिप्ट "afterburner.cmd" नामक फ़ाइल बना सके, यदि यह अस्तित्व में है, तो स्क्रिप्ट बाहर निकलने पर निष्पादित किया जाएगा। इस काम को करने के लिए कुछ बैच फ़ाइल चालबाजी थी।

एक स्टार्टअप cmd फ़ाइल आपके ग्रोवी स्क्रिप्ट/ऐप को आमंत्रित करने से पहले वर्तमान निर्देशिका को "सेट" भी कर सकती है।

वैसे, स्टार्टअप cmd होने से मुझे लगता है कि यह होगा - यह आपके पर्यावरण को स्थिर बनाता है और आपको अन्य मशीनों पर अपनी "स्क्रिप्ट" को अधिक आसानी से तैनात करने की अनुमति देता है। मैंने अपनी स्क्रिप्ट को क्लास को संकलित भी किया है क्योंकि यह एक .clroy को .class में संकलित करने के लिए तेज़ हो गया है और "जावा" के साथ क्लास को शुरू करने के बजाय इसे "ग्रोवी" के साथ स्क्रिप्ट चलाने के लिए शुरू किया गया था - और आम तौर पर आप संकलन चरण को छोड़ सकते हैं जो इसे बहुत तेज़ बनाता है!

2) कुछ छोटे आदेशों के लिए, आप इस तरह की एक विधि में लिख सकते हैं:

def currentDir = "C:\\" 
def exec(command, dir = null) { 
    "cmd /c cd /d ${dir?:currentDir} && $command".execute().text 
} 

// Default dir is currentDir 
assert exec("dir").endsWith("C:\\>") 

// different dir for this command only 
assert exec("dir", "c:\\users").endsWith("C:\\users") 

// Change default dir 
currentDir = "C:\\windows" 
assert exec("dir").endsWith("C:\\windows") 

यह की तुलना में "धीमी हो जाएगा" .execute() करता है, तो "cmd" जरूरी नहीं है।

3) कोड एक छोटा सा वर्ग है कि एक "ओपन" कमांड खोल (मैं एक बार ऐसा किया, वहाँ जटिलता का एक सा है) का कहना है, लेकिन यह विचार है: "में"

def process="cmd".execute() 
def in=process.in 
def out=process.out 
def err=process.err 

अब एक है इनपुट स्ट्रीम जिसे आप स्पिन कर सकते हैं/पढ़ सकते हैं और "आउट" एक आउटपुट स्ट्रीम है जिसे आप कमांड लिख सकते हैं, त्रुटियों का पता लगाने के लिए "त्रुटि" पर नजर रखें।

कक्षा को आउटपुट को कमांड लिखना चाहिए, कमांड पूरा होने तक इनपुट को पढ़ना चाहिए और आउटपुट को उपयोगकर्ता को वापस कर देना चाहिए।

समस्या यह पता लगा रही है कि किसी भी दिए गए आदेश का आउटपुट पूरा हो गया है। आम तौर पर आप "सी: ..." प्रॉम्प्ट का पता लगा सकते हैं और मान लें कि इसका मतलब है कि कमांड निष्पादित हो गया है। आप एक टाइमआउट का भी उपयोग कर सकते हैं। दोनों बहुत गिरने योग्य हैं। आप उस शेल के प्रॉम्प्ट को कुछ कम करने के लिए अद्वितीय कुछ सेट कर सकते हैं।

लाभ यह है कि यह खोल आपके ऐप के पूरे जीवन के लिए खुला रह सकता है और आप बार-बार "cmd" गोले बनाते समय गति में काफी वृद्धि कर सकते हैं। आप एक वर्ग बनाते हैं कि उसके बाद अपने प्रक्रिया वस्तु लपेटता इसका इस्तेमाल करने की वास्तव में आसान होना चाहिए (इसे "CommandShell" कहते हैं):

def cmd=new CommandShell() 
println cmd.execute("cd /d c:\\") 
println cmd.execute("dir") // Will be the dir of c:\ 

मैं इस एक बार की तरह एक ग्रूवी वर्ग ने लिखा है, यह प्रयोग करने और अपने का एक बहुत है उदाहरण "बाहर निकलने" जैसे आदेशों द्वारा ट्रैश किया जा सकता है लेकिन यह संभव है।