2012-08-23 10 views
12

मैं विभिन्न फ़ाइल विशेषताओं को पढ़ने के लिए जावा एप्लिकेशन (विंडोज कमांड प्रॉम्प्ट के माध्यम से) से पावरहेल को कॉल कर रहा हूं।पावरहेल में विशेष पथ वाले फ़ाइल पथों का उपयोग कैसे करें?

उदा।

powershell (get-item 'C:\Users\erlpm\Desktop\Temp\s p a c e s.txt').creationTime 

मैं एकल उद्धरण में फ़ाइल पथ संलग्न कर रहा हूं, क्योंकि इसमें रिक्त स्थान हो सकते हैं। यह ठीक काम करता है, जब तक कि मुझे स्क्वायर ब्रैकेट वाले फ़ाइल पथ का सामना नहीं हुआ, जिसे वाइल्डकार्ड वर्ण के रूप में समझा जाता है। मैं -literalPath पैरामीटर जोड़कर इसे हल करने में कामयाब रहे:

powershell (get-item -literalpath 'C:\Users\erlpm\Desktop\Temp\brackets[].txt').creationTime 

अब तक तो अच्छा ... लेकिन फ़ाइल पथ भी एकल कोट, डॉलर चिह्न, एम्पेरसैंड्स, हो सकती है ... और ये सब पात्रों में शक्तियों में एक विशिष्ट कार्य प्रतीत होता है जिसके लिए -literalPath पैरामीटर काम नहीं कर रहा है। मैंने डबल कोट्स के साथ पथ को घेरने की कोशिश की या 'चरित्र के साथ भागने की कोशिश की, लेकिन इससे मेरी समस्या हल नहीं हुई :-(

पावरहेल में फ़ाइल पथ को पास करने के तरीके के बारे में कोई सुझाव जिसमें रिक्त स्थान, सिंगल कोट्स, वर्ग कोष्ठक, एम्पेरसैंड्स, डॉलर चिह्न आदि

अद्यतन? किसी ने यहाँ पहले से ही मुझे पता चला है कि यह कैसे Powershell के भीतर से काम कर पाने के लिए है, लेकिन किसी भी तरह जवाब हटा दिया गया है
वैसे भी, मैंने किया था $ & ' [].txt नामक एक फ़ाइल बनाएं। यह कार्य प्रपत्र भीतर Powershell (& से बचने के लिए आवश्यक):

PS C:\Users\erlpm> Get-Item -LiteralPath "C:\Users\erlpm\Desktop\Temp\`$ & ' [].txt" 


    Directory: C:\Users\erlpm\Desktop\Temp 


Mode    LastWriteTime  Length Name 
----    -------------  ------ ---- 
-a---  2012-08-23  14:22   0 $ & ' [].txt 

लेकिन जब मैं विंडोज कमांड प्रॉम्प्ट के माध्यम से एक ही PowerShell आदेश पर अमल, ... इस त्रुटि

C:\Users\erlpm>powershell Get-Item -LiteralPath "C:\Users\erlpm\Desktop\Temp\`$ & ' [].txt" 

... मैं मिल :

Ampersand not allowed. The & operator is reserved for future use; use "&" to pass ampersand as a string. 
At line:1 char:55 
+ Get-Item -LiteralPath C:\Users\erlpm\Desktop\Temp\`$ & <<<< ' [].txt 
    + CategoryInfo   : ParserError: (:) [], ParentContainsErrorRecordException 
    + FullyQualifiedErrorId : AmpersandNotAllowed 

-command पैरामीटर का उपयोग करना औरके बीच PowerShell आदेश डालवास्तव में देता है एक ही त्रुटि संदेश ...

C:\Users\erlpm>powershell -command {Get-Item -LiteralPath "C:\Users\erlpm\Desktop\Temp\`$ & ' [].txt"} 
+0

आप रास्तों जो काम नहीं कर रहे के कुछ उदाहरण हैं, और सटीक त्रुटि आप प्राप्त प्रदान कर सकता है? आपने अभी तक केवल कार्य पथ प्रदान किए हैं, इसलिए यह कहना मुश्किल है कि समस्या कहां है। – latkin

+0

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

+0

मैंने "$ * '[] .txt" नामक फ़ाइल बनाकर अपनी समस्या का पुन: उत्पन्न किया। फिर, एक पावरहेल प्रॉम्प्ट से, मैंने प्राप्त करें और पावरहेल ने मेरे लिए फ़ाइल नाम पूरा किया, लेकिन मैं यहां पूरा फ़ाइल नाम पेस्ट नहीं कर सकता क्योंकि मार्कडाउन सभी विशेष पात्रों को खाता है। इसे आज़माएं और देखें कि क्या इससे मदद मिलती है। – joXn

उत्तर

7

आप एक अस्थायी txt फ़ाइल के लिए पथ लिख सकते हैं, तो ठीक निम्नलिखित काम करता है:

(get-item -literalpath (gc 'C:\Temp\path.txt')).creationTime 

फ़ाइल @ C: \ अस्थायी \ पथ .txt में इसमें विशेष वर्णों वाला पथ शामिल है, इसके अलावा मुझे लगता है कि आपको प्रति विशेष आधार पर प्रत्येक विशेष चरित्र से बचना होगा।

उपरोक्त हैक के अलावा, ऐसा लगता है कि पावरहेल वी 3 यहां एक नई 'जादू पैरामीटर' भाषा सुविधा के अतिरिक्त मदद कर सकता है। विशेष रूप से, खंड अध्यक्षता में 'कमांड लाइन्स के आसान पुन: उपयोग Cmd.exe से' here देख सकते हैं और क्योंकि मैं कड़ी सड़ांध से नफरत है, यहाँ यह, बेशर्म नीचे गयी है:

आसान कमान Cmd से लाइन्स के पुन: उपयोग।exe

वेब सीएमडी.एक्सई के लिए लिखित कमांड लाइनों से भरा है। ये आदेश लाइनें अक्सर PowerShell में पर्याप्त काम करती हैं, लेकिन जब उनमें कुछ वर्ण शामिल होते हैं, उदा। एक अर्धविराम (;) एक डॉलर का चिह्न ($), या घुंघराले ब्रेसिज़, आपको कुछ बदलाव करना होगा, शायद कुछ उद्धरण जोड़ना होगा। यह कई मामूली सिरदर्द का स्रोत प्रतीत होता था।

इस परिदृश्य को हल करने में सहायता के लिए, हमने कमांड लाइनों के पार्सिंग से बचने के लिए एक नया तरीका जोड़ा। यदि आप एक जादू पैरामीटर का उपयोग करते हैं -%, हम को अपनी कमांड लाइन के सामान्य पार्सिंग को रोकते हैं और पर कुछ आसान स्विच करते हैं। हम उद्धरण से मेल नहीं खाते हैं। हम अर्धविराम पर नहीं रुकते हैं। हम PowerShell चर का विस्तार नहीं करते हैं। यदि आप Cmd.exe वाक्यविन्यास (उदा।% TEMP%) का उपयोग करते हैं, तो हम पर्यावरण चर का विस्तार करते हैं। इसके अलावा, लाइन के अंत तक तर्क (या पाइप, यदि आप पाइपिंग कर रहे हैं) पास किए गए हैं।

echoargs.exe --% %USERNAME%,this=$something{weird} 
Arg 0 is <jason,this=$something{weird}> 
8

यह वास्तव में cmd.exe स्ट्रिंग से बचने के लिए, तो के बारे में एक सवाल है: यहाँ एक उदाहरण है। सीएमडी और पावरहेल स्ट्रिंग से बचने का कुल दुःस्वप्न है। कुछ प्रयासों के बाद, मुझे काम करने के लिए आपका विशिष्ट उदाहरण मिला:

C:\Users\latkin>powershell.exe -nologo -noprofile -command ^&{ dir -LiteralPath ^"""".\`$ & ' [].txt"" } 

    Directory: C:\Users\latkin 
Mode    LastWriteTime  Length Name 
----    -------------  ------ ---- 
-a---   8/23/2012 8:46 AM   0 $ & ' [].txt 

पूरी तरह से सहज, सही?

आप हर बार बचने के दृश्यों के साथ 15 मिनट कुश्ती खर्च कर सकते हैं, या आप कुछ अन्य अपहरणों को आजमा सकते हैं।

फ़ाइल नाम को एक टेक्स्ट फ़ाइल में रखें, और इसे वहां से पढ़ें।

C:\> powershell.exe -command "&{dir -literal (gc .\filename.txt) }" 

या

एक स्क्रिप्ट

C:\> powershell.exe -file .\ProcessFiles.ps1 # in processfiles.ps1 you are in fully powershell environment, so escaping is easier 

या

उपयोग का प्रयोग करें -EncodedCommand

देखें powershell.exe -? (अंतिम आइटम दिखाया गया) या http://dmitrysotnikov.wordpress.com/2011/07/06/passing-parameters-to-encodedcommand/

+0

जैसा कि आपने सुझाव दिया था, मैंने विशेष पात्रों से बचने की कोशिश छोड़ दी और फ़ाइलपैथ को एक अस्थायी फ़ाइल में लिखा। यह ठीक काम करता प्रतीत होता है! 2017 बैकटिक में –

2

यह धागा 5 साल पुराना है, इसलिए शायद समय बदल गया है, लेकिन मेरे लिए काम करने वाला वर्तमान उत्तर विशेष चरित्र से बचने के लिए बैकटिक (`) प्रतीक का उपयोग करना था।

मेरे मामले में, यह एक निर्देशिका पथ में एक डॉलर का संकेत था जो विफल रहा था। डॉलर के हस्ताक्षर से पहले एक बैकटिक डालकर, सबकुछ काम करता था।

से पहले:

$dir = "C:\folder$name\dir" # failed 

के बाद:

$dir = "C:\folder`$name\dir" # succeeded 
+0

पूरी तरह से काम करता है –

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