एक Caché सर्वर पर ऑपरेटिंग सिस्टम कमांड निष्पादित करना

डेवलपर कनेक्शन में एक लेख के आधार पर , उन्होंने सर्वर ऑपरेटिंग सिस्टम से कमांड भेजने के लिए एक वर्ग का अपना कार्यान्वयन लिखा , जहां कैच या एनसेंबल स्थापित है।
जब आप होस्ट ओएस पर कैच से कुछ करने की आवश्यकता होती है तो एक वर्ग काम में आ सकता है: बैकअप फ़ाइलों का प्रबंधन, संस्करण नियंत्रण प्रणाली और अन्य उपयोगी कार्यों के साथ काम कॉन्फ़िगर करें।
वर्ग आपको किसी भी होस्ट ओएस पर एक कमांड निष्पादित करने और एक वैश्विक या स्थानीय चर पर प्रतिक्रिया प्राप्त करने की अनुमति देता है।

टिप्पणियों के साथ कक्षा कोड
वर्ग Server.Manage% RegisteredObject का विस्तार करता है
{

पैरामीटर cmdlist = "डायर, प्रकार, क्रिया " ;

/// विधि कमांड लाइन से कमांड अनुक्रम हटाती है
/// केवल आदेशों की अनुमति देता है
ClassMethod safeCmd ( cmd ) % स्ट्रिंग के रूप में
{
cmd = $ piece ( cmd , "&&" ) // एक आदेश छोड़ें
सेट cmd = $ टुकड़ा ( cmd , "|" )
i = 1: 1: $ लंबाई (.. #cmdlist , "," ) सुरक्षित सेट करें ( $ p (.. #cmdlist , "," , i )) = "" // अनुमत आदेशों की सूची
अगर ' $ डेटा ( सुरक्षित ( $ piece ( cmd , "" ))) cmd = "" सेट करें
सीएमडी छोड़ दें
}

/// विधि सर्वर पर cmd कमांड निष्पादित करती है और परिणाम को विज्ञापन वैश्विक में जोड़ती है ताकि:
/// @ विज्ञापन = लाइनों की संख्या
/// @ ad @ (लाइन नंबर) = वैल्यूएशिया
ClassMethod runCmd ( cmd , ad As% String ) % स्थिति के रूप में
{
सेट sc = $$$ ठीक है
$ System .Process करें SetZEOF (1) // EOF पर एरर जेनरेशन मोड को बंद करें
// कमांड लाइन को सुरक्षित बनाएं
cmd (1) = .. safeCmd ( cmd ) सेट करें
छोड़ दिया : cmd (1) = "" $$$ ERROR ( $$$ GeneralError , "अमान्य कमांड" _ cmd )
cmd = cmd (1) सेट करें
// भेजे गए वैश्विक को साफ़ करें
मार डालो @ विज्ञापन
गिनती गिनना = ०

कोशिश करो {
// कमांड लाइन के साथ डिवाइस खोलें और प्रतिक्रिया पढ़ें
खुले cmd : "QR: K \ CP866 \" अगर ' $ परीक्षण $ $ $ $ ThrowStatus ( $$$ ERROR ( $$$ GeneralError , "कमांड निष्पादित नहीं कर सका" _ cmd ))
IO = $ IO सेट करें / करेंट डिवाइस याद रखें
// कमांड लाइन के परिणाम को फाइल के अंत तक आने तक पढ़ें और इसे वैश्विक में जोड़ें
{के लिए
cmd का उपयोग करें
$ str पढ़ें : $ zeof = -1
सेट @ विज्ञापन @ ( $ वृद्धि ( गिनती )) = str
}
सेट @ विज्ञापन = गिनती
// डिवाइस बंद करें
#dim %% अपवाद के रूप में
} पकड़ो {
सेट sc = AsStatus ()
// do e.Log () //
}
// डिवाइस बंद करें
करीब सीएमडी

// वर्तमान डिवाइस लौटाएं
यदि $ डेटा ( IO ) IO का उपयोग करें
sc छोड़ दिया
}

}

Cmdlist पैरामीटर में अनुमत कमांड की एक सूची है, जो अल्पविराम से अलग होती है।
SafeCmd () विधि कमांड लाइन को कंघी करती है।
RunCmd () विधि वास्तव में cmd ​​कमांड को निष्पादित करती है और परिणाम को अप्रत्यक्ष पता विज्ञापन में डालती है।

उपरोक्त कोड काचे द्वारा समर्थित सभी ऑपरेटिंग सिस्टम पर काम करता है, कमांड निष्पादित करता है, परिणाम प्राप्त करता है और त्रुटियों को संसाधित करता है। लेख में वर्णित कार्यान्वयन के विपरीत, कार्य कमांडपाइप डिवाइस के माध्यम से आयोजित किया जाता है - खुले कमांड के लिए "क्यूआर" मोड। प्रलेखन में अधिक पढ़ें।

डेमो

उपयोग का एक उदाहरण यहां देखा जा सकता है - CSP + ट्विटर बूटस्ट्रैप पर निर्मित एक छोटी परियोजना।
सर्वर को वध के लिए नहीं भेजा गया - अनुमत कमांड: प्रकार, वेर, प्रारूप c, dir।
वर्ग और वेब प्रोजेक्ट कोड को github पर पोस्ट किया गया है।

Source: https://habr.com/ru/post/In174601/


All Articles