2009-11-25 19 views
5

में टेस्ट-पथ व्यवहार मैं वीडियो फ़ाइलों को कनवर्ट करने के लिए पावरहेल में एक स्क्रिप्ट लिखने की कोशिश कर रहा हूं।पावरहेल

जिस तरह से मैं इसका उपयोग करना चाहता हूं वह वीडियो फ़ाइलों से भरा कुछ फ़ोल्डर में जाना और इसे चलाने के लिए है। यह एक रूपांतरण प्रोग्राम का उपयोग करता है जिसे "कमांड लाइन मोड" (हैंडब्रैक नामित) में चलाया जा सकता है और फ़ाइल एक्सटेंशन से पहले कनवर्ट की गई फ़ाइलों को "-android" से जोड़ता है। उदाहरण के लिए, यदि मेरे पास फ़ोल्डर में video1.avi नाम की एक फ़ाइल है, तो स्क्रिप्ट चलाने के बाद फ़ोल्डर में 2 फाइलें हैं: video1.avi और video1-android.avi

कारण मैं ऐसा करना चाहता हूं कि मैं जांच सकता हूं कि, प्रत्येक वीडियो फ़ाइल के लिए, इसमें एक परिवर्तित संस्करण है (साथ ही एंड्रॉइड नाम पर जोड़ा गया है)। और यदि ऐसा है, तो उस फ़ाइल के लिए रूपांतरण छोड़ दें।

और यह वह जगह है जहां मैं दोगुना हो रहा हूं। समस्या टेस्ट-पथ का व्यवहार है (cmdlet मैं परीक्षण करने के लिए उपयोग कर रहा हूं यदि कोई फ़ाइल मौजूद है)।

क्या होता है, अगर वीडियो फ़ाइल में "असामान्य" नाम होता है (उदाहरण के लिए मेरे मामले में यह वीडियो [लंबा] .avi) टेस्ट-पथ हमेशा गलत होता है यदि आप यह जांचने का प्रयास करते हैं कि वह फ़ाइल मौजूद है या नहीं।

आप इस परीक्षण करने के लिए के लिए एक आसान तरीका है उदाहरण यह करने के लिए के लिए है:

&notepad test[x].txt 
: एक खाली फ़ोल्डर में

जाओ, के साथ एक फ़ाइल बनाने के लिए रन नोटपैड "[" अपने नाम में

फ़ाइल

तो ऐसा करने में सहेजें

Get-ChildItem | ForEach-Object {Test-Path $_.FullName} 

यह करता है सच नहीं आओ! यह सही होना चाहिए? वैसे यह नहीं है कि फ़ाइल में "[" इसके नाम पर है (मैंने किसी अन्य विशेष पात्रों की जांच नहीं की है)

मुझे एहसास हुआ है कि यदि आप "[" और "]" से बचते हैं तो यह

काम करता है
Test-Path 'test`[x`].txt' 

सत्य लौटाता है।

मैं इस मुद्दे के आसपास कैसे जा सकता हूं? मैं सक्षम होना चाहता हूं: फ़ाइल का बेसनाम दिया गया है, इसे "-android.avi" संलग्न करें और जांचें कि उस नाम वाली फ़ाइल मौजूद है या नहीं।

धन्यवाद, रुई

उत्तर

8

कई PowerShell cmdlets कि wildcarding समर्थन पथ पैरामीटर शामिल हैं। जैसा कि आपने देखा है, PowerShell में केवल * एक वाइल्डकार्ड नहीं है लेकिन [ और ] को वाइल्डकार्ड वर्ण भी माना जाता है। आप इसके बारे में सहायता विषय में wildcards के बारे में और अधिक पढ़ सकते हैं।

आपकी समस्या के लिए, यदि आपको वाइल्डकार्डिंग की आवश्यकता नहीं है तो मैं -LiteralPath पैरामीटर का उपयोग करने की अनुशंसा करता हूं। यह पैरामीटर wildcarding का समर्थन नहीं करता और [ स्वीकार करता है और ] के रूप में शाब्दिक पथ वर्ण जैसे:

Get-ChildItem | ForEach {Test-Path -LiteralPath ` 
         "$([io.path]::ChangeExtension($_.FullName,'avi'))"} 

FYI करें, कारण सीधे टेस्ट-पथ में Get-ChildItem के उत्पादन में पाइप काम करता है क्योंकि LiteralPath पैरामीटर का उपनाम हो है "PSPath" जो PSPath प्रॉपर्टी पर GetIn ChildItem द्वारा FileInfo ऑब्जेक्ट आउटपुट पर मानचित्र करता है।वह संपत्ति "संपत्ति नाम से" लिटलपैथ (एर पीएसपीएथ) पैरामीटर से जुड़ी हो जाती है।

+0

धन्यवाद, यही वही था जो मुझे चाहिए था – Rui

1
dir | % {test-path "$($_.Name)-android.avi"} 
+1

क्या आप उस पर विस्तार कर सकते हैं, $ ($ _। नाम) और "% {}" क्यों? – Rui

+1

'%' और 'Foreach' Forech-Object cmdlet के लिए उपनाम हैं। एक स्ट्रिंग के अंदर, आप सरल परिवर्तनीय विस्तार कर सकते हैं जैसे कि "$ _" 'लेकिन यदि आप किसी ऑब्जेक्ट की किसी प्रॉपर्टी को एक्सेस करने जैसी अभिव्यक्ति का मूल्यांकन करना चाहते हैं, तो आपको एक उप-एक्सप्रेशन का उपयोग करना होगा। '" $ ($ _। नाम) "'। –