2011-10-29 17 views
7

में डबल कोट साइड इफेक्ट से बच निकला है मुझे विंडोज कमांड दुभाषिया के साथ एक बहुत ही मुश्किल समस्या का सामना करना पड़ा है। यह एक्सपी और विंडोज 7 दोनों पर होता है। नीचे मेरा विवरण एक पर्ल स्क्रिप्ट पर लागू होता है, लेकिन यह समस्या कमांड लाइन पैरामीटर लेता है जो कमांड लाइन पर किसी भी प्रकार का प्रोग्राम चलाने के लिए लागू होता है।विंडोज कमांड प्रॉम्प्ट

एक परीक्षण मैं पर्ल स्क्रिप्ट check-params.pl उपयोग कर रहा हूँ जो केवल आउटपुट क्या यह पैरामीटर के रूप में देखा था के लिए -

use strict; 
use warnings; 
while (my $param = shift @ARGV) { 
    print "Param: [$param]\n"; 
} 

इस प्रकार अगर मैं चलाने -

perl check-params.pl "a b|<>" c^|^<^>cc 

फिर उत्पादन

[Param: a b|<>] 
[Param: c|<>cc] 
है

अपेक्षित के रूप में। विशेष वर्ण | <> डबल कोट्स के अंदर ठीक काम करें, लेकिन जब बाहर उद्धरण आप उन्हें^से बचें।

लेकिन जब एक दोहरे उद्धरण

perl check-params.pl "a\" b|<>" 

में उद्धृत परम जैसे में जोड़ा जाता है तो मैं त्रुटि मिलती है -

> was unexpected at this time. 

लेकिन अगर दोहरे उद्धरण विशेष वर्ण के बाद आता है | < या>, तो यह ठीक काम करता है।

आप विशेष से बचकर इसे आसानी से ठीक कर सकते हैं। <> उद्धृत पैरामीटर के अंदर^के साथ char। जैसे

perl check-params.pl "a\" b^|" 

हालांकि यह न केवल बच गए दोहरे उद्धरण विशेष वर्ण को प्रभावित करता है | <>वर्तमान पैरामीटर में लेकिन यह किसी भी बाद के पैरामीटर के अंदर इन विशेष वर्णों को प्रभावित करता है।

जैसे यदि मैं यह कर -

perl check-params.pl "aa \"bb" ccc | perl check-pipe.pl 

(जहां check-pipe.pl बस आउटपुट क्या पाइप प्राप्त -

use strict; 
use warnings; 
while (<STDIN>) { 
    print "PIPE RECEIVED ---> $_"; 
} 

)

तो उत्पादन होता है -

Param: [aa "bb] 
Param: [ccc] 
Param: [|] 
Param: [perl] 
Param: [check-pipe.pl] 

यानी यह पाइप का इलाज करता है | एक शाब्दिक चरित्र के रूप में, और कोई पाइपिंग होता है।

क्या किसी को इस समस्या का कोई अनुभव है, और किसी भी कामकाज के बारे में पता है?

मैं वेब लॉग फ़ाइलों को प्रोसेस करने के लिए कुछ पर्ल स्क्रिप्ट में लिखा है, और एक regex के, जो मैं कमांड लाइन पर एक उद्धृत परम अंदर पारित उपयोग करता है। रेगेक्स में वर्ण जैसे अक्षर हो सकते हैं <>, और इसमें एक डबल कोट भी हो सकता है, जिसे मैं \ "के रूप में दर्ज करता हूं। इस प्रकार उपर्युक्त समस्या बढ़ रही है।

किसी भी मदद की बहुत सराहना की, धन्यवाद।


धन्यवाद उत्तर के लिए है, लेकिन XP SP3 पर इस कोशिश कर रहा पर, पर्ल स्क्रिप्ट दो कमांड लाइन पैरामीटर देख रहा है। |,

'c"' is not recognized as an internal or external command, 
operable program or batch file. 

लेकिन

echo "a b|\"c" 

काम करता है \ "विशेष वर्ण के बाद आता है, क्योंकि -

यह समस्या पर्ल से संबंधित नहीं है, जैसे

echo "a \"b|c" 

त्रुटि पैदा करता है

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


अतिरिक्त जानकारी:

मैं अद्यतन किया है लिपियों check-params.pl और अधिक उपयोगी जानकारी देने के लिए check-pipe.pl: -

check-params.pl: -

use strict; 
use warnings; 
while (my $param = shift @ARGV) { 
    print "COMMAND LINE RECEIVED: [$param]\n"; 
} 

check-pipe.pl: -

use strict; 
use warnings; 
while (<STDIN>) { 
    print "PIPE RECEIVED: $_"; 
} 

while (my $param = shift @ARGV) { 
    print "COMMAND LINE RECEIVED: [$param]\n"; 
} 

उदाहरण चल रहा है के लिए: -

perl pl/utils/check-params.pl l1 l1-b l1-c | perl pl/utils/check-pipe.pl l2 l2-b | perl pl/utils/check-pipe.pl l3 l3-b | perl pl/utils/check-pipe.pl united arsenal rangers raith 

का उत्पादन उत्पादन: -

PIPE RECEIVED: PIPE RECEIVED: PIPE RECEIVED: COMMAND LINE RECEIVED: [l1] 
PIPE RECEIVED: PIPE RECEIVED: PIPE RECEIVED: COMMAND LINE RECEIVED: [l1-b] 
PIPE RECEIVED: PIPE RECEIVED: PIPE RECEIVED: COMMAND LINE RECEIVED: [l1-c] 
PIPE RECEIVED: PIPE RECEIVED: COMMAND LINE RECEIVED: [l2] 
PIPE RECEIVED: PIPE RECEIVED: COMMAND LINE RECEIVED: [l2-b] 
PIPE RECEIVED: COMMAND LINE RECEIVED: [l3] 
PIPE RECEIVED: COMMAND LINE RECEIVED: [l3-b] 
COMMAND LINE RECEIVED: [united] 
COMMAND LINE RECEIVED: [arsenal] 
COMMAND LINE RECEIVED: [rangers] 
COMMAND LINE RECEIVED: [raith] 

इस प्रकार पुष्टि है कि इस आदेश पंक्ति अपेक्षा के अनुरूप काम करेंगे। स्क्रिप्ट कमांड लाइन पर किसी भी पाइप के साथ काम करेंगे।


अतिरिक्त जानकारी:

मुझे लगता है मैं यह कई समाधानों का उपयोग कर काम करने के लिए प्राप्त कर सकते हैं - जैसे^"हैरी उल्लेख एक उदाहरण है कभी कभी तुम regex recraft का उपयोग कर से बचने के लिए कर सकते हैं।"। जब विशेष char | <> से पहले दो \ "अनुक्रम होते हैं तो समस्या उत्पन्न नहीं होती है। किसी भी कमांड चलाने से पहले मैं check-params.pl चलाता हूं और चेक-pipe.pl को यह सत्यापित करने के लिए कि पर्ल स्क्रिप्ट्स कमांड लाइन पैरामीटर कैसे देखेंगे , उदाहरण के लिए मेरे ओपी में उपर्युक्त संपादन इन स्क्रिप्ट का वर्णन करता है, जिसे मैंने अपने ओपी के बाद संशोधित किया है।

+0

हालांकि मुझे विश्वास है कि मुझे आपके लिए समाधान मिला है (मेरे उत्तर में नवीनतम संपादन देखें) यदि आप नियमित अभिव्यक्तियों को अंतःक्रियात्मक रूप से दर्ज कर रहे हैं तो आपको उन्हें अपनी स्क्रिप्ट के लिए उनके लिए संकेत देने के बजाय अधिक सुविधाजनक लग सकता है कमांड लाइन। इस तरह आपको सभी विशेष पात्रों से बचने की ज़रूरत नहीं होगी। –

+0

जानकारी के लिए बहुत धन्यवाद। मैंने अपने ओपी में अपने परीक्षणों से छाप छोड़ी थी कि \ "एक बच निकला अनुक्रम था। मेरे लिए कमांड लाइन पैरा को एक प्रॉम्प्ट के माध्यम से दर्ज करना संभव नहीं है क्योंकि मेरे पास बहुत सारे आदेश हैं और वे काफी जटिल हैं। मैं कॉपी और पेस्ट करता हूं उन्हें एक टेक्स्ट फ़ाइल से, और कभी-कभी मैं कई कॉपी करता हूं और उन्हें एक साथ चलाता हूं। (त्वरित संपादन मोड के साथ आप कमांड विंडो में पेस्ट करने के लिए राइट-क्लिक कर सकते हैं)। –

उत्तर

2

\ "में दोहरा उद्धरण प्रारंभिक डबल कोट से मेल खाता है, उद्धृत पैरामीटर को समाप्त करता है। एक उद्धृत पैरामीटर में एक दोहरे उद्धरण दो दोहरे उद्धरण चिह्नों का उपयोग शामिल करने के लिए:

perl check-params.pl "a"" b|<>" 

परिणाम आप उम्मीद कर रहे हैं, कैसे perl.exe पार्स कमांड लाइन पैरामीटर के आधार पर (मैं के रूप में कमांड पटकथा के परीक्षण किया है का उत्पादन करना चाहिए मेरे पास पर्ल स्थापित नहीं है)।ताकि "" \ के बजाय "एक दोहरे उद्धरण के रूप में व्यवहार किया जाता है आपको अपनी स्क्रिप्ट को बदलना होगा

अतिरिक्त:। इस कमांड लाइन एक त्रुटि संदेश में

echo "a \"b|c" 

परिणाम c" is not recognized शुरू करने । यह एक बग एक बैकस्लैश एक भागने चरित्र नहीं है नहीं है।

, तो कमांड लाइन से एक उद्धृत स्ट्रिंग ("a \") एक पाइप (|) जो बाकी बनाता है के बाद होता है (c") एक अतिरिक्त कमांड, जो इको कमांड से आउटपुट पाइप किया गया है।

आप के बजाय कहते हैं

echo "a ""b|c" 

फिर वहाँ सिर्फ एक उद्धृत स्ट्रिंग ("a ""b|c") है और यह अपेक्षा के अनुरूप काम करेंगे।

दुर्भाग्य से, मैं अब पुष्टि कर सकते हैं ActivePerl के आदेश-पंक्ति पार्स का कारण बनता है कि

perl check-params.pl "a"" b|" 

दो पैरामीटर में विभाजित किया जाना है। आपको पूरी कमांड लाइन लाने की आवश्यकता हो सकती है (यदि पर्ल में ऐसा करने का कोई तरीका है) और इसे स्वयं पार्स करें।

अतिरिक्त:

perl check-params.pl ^"a\^" b^|c^" 

वांछित परिणाम पैदा करता है। यह उद्धरण चिह्नों सहित सभी विशेष पात्रों से बचकर काम करता है।

+0

^"काफी मददगार है, और मैंने जोड़ा है यह मेरे कई कामकाज के लिए है। यहां 2 समस्याएं दिखाई देती हैं, एक ऐसा है कि विंडोज कमांड दुभाषिया कैसे काम करता है, और दूसरा यह है कि पर्ल एक कमांड लाइन कैसे पार्स करता है। –

संबंधित मुद्दे