क्या वाइल्डकार्ड रास्तों का विस्तार करने के लिए विंडोज़ cmd शेल प्राप्त करने का कोई तरीका है?


37

कभी-कभी, वाइल्डकार्ड पथों का विस्तार करने के लिए cmd शेल की अक्षमता वास्तव में एक असुविधा हो सकती है। मुझे एक कार्यक्रम में एक निर्देशिका में 100 फाइलें पास करनी थीं, और * .ext टाइप नहीं कर सकता था। इसके बजाय, मैंने एक फ़ाइल में सूची को डंप करने के लिए मिंगव के 'ls' का उपयोग किया, फिर रिक्त स्थान के साथ newlines को प्रतिस्थापित किया, जिसे cmd में कॉपी और पेस्ट किया गया। काफी बुरा सपना।

मुझे लगता है कि उत्तर नहीं होगा, लेकिन क्या किसी ने इससे निपटा है या इसे आसान बनाने के लिए किसी भी तरह से आया है?


2
क्या आपने इसके बजाय पॉवरशेल जैसी किसी चीज़ का उपयोग करने पर विचार किया है?

I suspect the answer will be no, but has anyone dealt with this or come up with any way to make this easier? वास्तव में, मैं विपरीत समस्या आ रही है, मैं एक तरह से यह पता लगाने की कोशिश कर रहा हूँ कमांड दुभाषिया तार के रूप में अपनी सूची का इलाज और करने के लिए प्राप्त करने के लिए रोकने के यह उनके लिए वाइल्डकार्ड के रूप में inreptreting से। उदाहरण के लिए, for %i in (foobar baz really?) do @echo %iपिछले आइटम (व्यवहार करेगा really?) एक फ़ाइल नाम वाइल्डकार्ड के रूप में है, और इसे छोड़ अगर वहाँ नाम का कोई फ़ाइलें हैं really1, reallyzआदि ☹
Synetech

1
@Synetech - ?विंडोज फाइल सिस्टम में फ़ाइल नाम के लिए एक कानूनी चरित्र नहीं है। चरित्र की व्याख्या केवल एक वाइल्डकार्ड के रूप में की जा सकती है। देखें फ़ाइलें, पथ और नेमस्पेस नामकरण MSDN पर और वाइल्डकार्ड वर्णों का उपयोग करना TechNet में।
jww

जवाबों:


18

डॉस, और फलस्वरूप विंडोज ' cmd.exe, ने कभी शेल द्वारा वाइल्डकार्ड विस्तार का समर्थन नहीं किया। यह हमेशा विस्तार करने के लिए आवेदन पर निर्भर था।

इसका मतलब है कि यदि आप एक एप्लिकेशन का उपयोग कर रहे हैं तो आपको हमेशा एक और मार्ग खोजना होगा जो विस्तार का समर्थन नहीं करता है। आप ऐसा कर सकते हैं:

  • उन सभी फ़ाइलों के विरुद्ध कुछ कमांड चलाने के लिए एक फ़ोर लूप का उपयोग करें जिसमें आप रुचि रखते हैं
  • विस्तार का कार्य करने के लिए कमांड dir /b > list.txtका उपयोग करें dirऔर फ़ाइलों की सूची को टेक्स्ट फ़ाइल में डालें (आप तब एक्सेल फॉर्मूला जैसी किसी चीज़ का उपयोग कर सकते हैं यदि आप वास्तव में पेस्ट करने के लिए कमांड की सूची बनाने के लिए बेताब हैं cmd, या आप एक्सेल का उपयोग कर सकते हैं कोशिकाओं को स्थानांतरित करने के लिए सभी फाइलनाम एक ही पंक्ति में हैं।)

उन्होंने बताया कि यह एक फ़ाइल और प्रक्रिया को फ़िल्टर करने और मैन्युअल रूप से कॉपी करने में डीआईआर के आउटपुट परिणामों के लिए एक दुःस्वप्न होगा। wmz का उत्तर और निश्चित रूप से मेरा एक फाइल सामग्री को मैन्युअल रूप से फ़िल्टर किए बिना काम करेगा।
wullxz

1
@wullxz: शायद, लेकिन किसी एक के रूप में ऐसा करने के इच्छुक पॉवरशेल से अपरिचित किसी के लिए, यह काफी तेजी से हो सकता है - और इस साइट के पीछे का विचार सभी कौशल स्तरों के लोगों को अब और संदर्भित करने के लिए उपयोगी समाधान प्रदान करना है। भविष्य, इसलिए वास्तव में मुझे यह बताने की कोई आवश्यकता नहीं है क्योंकि आपको लगता है कि मेरा उत्तर आपके जितना अच्छा नहीं है।
माल्विनस

1
"डॉस, और परिणामस्वरूप विंडोज 'cmd.exe, ने शेल द्वारा वाइल्डकार्ड विस्तार का कभी समर्थन नहीं किया।" - माइक्रोसॉफ्ट के अनुसार सच नहीं है। TechNet पर वाइल्डकार्ड वर्णों का उपयोग करना देखें । (लेकिन मुझे लगता है कि आप अभ्यास में सही हैं: ओ। अन्यथा, मैं यहां यह पता लगाने की कोशिश नहीं करूंगा कि फाइलें मेल क्यों नहीं खाती हैं)
jav

1
@jww: आपके द्वारा पोस्ट किया गया लिंक वाइल्डकार्ड वर्णों के मानक उपयोग की व्याख्या करता है, लेकिन मैं उनमें से किसी भी शेल द्वारा विस्तारित होने का उल्लेख नहीं देख सकता। UNIX (और बाद में लिनक्स और मैक) के विपरीत, Microsoft ने कमांड लाइन के मापदंडों को लागू करने के लिए वाइल्डकार्ड विस्तार को लागू करने के लिए प्रत्येक व्यक्ति के लिए छोड़ दिया।
माल्विनस

1
डॉस कमांड 'dir Filespec / b' वास्तव में अच्छी तरह से काम करता है, क्योंकि यह फ़ाइलों की एक सूची बनाता है, प्रति पंक्ति एक। अतिरिक्त 's' स्विच के साथ, फ़ाइल नाम पूरी तरह से योग्य (निरपेक्ष) हैं, और आसानी से किसी भी अन्य कमांड लाइन प्रोग्राम के लिए लूप के माध्यम से खिलाया जा सकता है जो फ़ाइल नाम लेता है। यह सबसे अच्छा हम कर सकते हैं, क्योंकि विंडोज में एक उचित ग्लोबिंग सुविधा नहीं है।
डेविड ए। ग्रे

9

बस Powershell का उपयोग करें, जो विंडोज 7 पर प्रीइंस्टॉल्ड है। Powershell cmd कमांड चलाने में सक्षम है और किसी भी स्थान पर वाइल्डकार्ड को समझने में सक्षम है।

पॉवर्सशैल को शुरू करने के लिए अपने स्टार्ट मेन्यू सर्च बॉक्स में "शक्तियां" टाइप करें और एंटर करें।


यदि आवेदन में सभी फाइलनाम के साथ एक स्ट्रिंग की उम्मीद है तो यह सही स्क्रिप्ट है:

$delimiter = " "
[string]$files = $nothing ; ls *.txt | % { $files += $_.fullname + $delimiter } ; application.exe $files

बदलें $delimiter = " "करने के लिए $delimiter = ","यदि आपके आवेदन एक अल्पविराम उम्मीद फ़ाइल नामों की सूची अलग कर दिया।

कोड की व्याख्या:

  • [string]$files = $nothing - प्रकार का एक खाली चर बनाता है string
  • ; - कई कमांड के लिए एक विभाजक है, न कि एक पाइपलाइन!
  • ls *.txt | % { $files += $_.fullname + $delimiter } - सभी पाठ फ़ाइलों की सूची प्राप्त करता है और सीमांकक द्वारा अलग किए गए सभी फ़ाइलनामों के साथ एक स्ट्रिंग बनाता है
  • application.exe $files - एप्लिकेशन को कॉल करता है और इसे फ़ाइल सूची पास करता है

तुम भी रिकर्सिवली जोड़कर एक फ़ाइल पैटर्न की खोज कर सकते हैं -recurseकरने के लिए ls *.txtतो पूरा कोड इस तरह दिखेगा:

$delimiter = " "
[string]$files = $nothing ; ls *.txt -recurse | % { $files += $_.fullname + $delimiter } ; application.exe $files

संपादित करें:
चिड़चिड़ापन से बचने के लिए, lsऔर के dirउपनाम हैं Get-ChildItemऔर %एक उपनाम है ForEach-Object। मैं अपना कोड उपयोग किए गए उपनामों के साथ रखता हूं क्योंकि यह छोटा है।

EDIT 2018/04/25:
2012 में वापस मैं PowerShell में काफी नया आया हूं। बेशक एक आसान तरीका है, हालांकि यह उतना आसान नहीं है जितना कि यूनिक्स / लिनक्स की ग्लोब विस्तार की क्षमता:

app.exe $(ls *.txt | % {$_.FullName})

स्पष्टीकरण:

  • $ () पहले के अंदर की अभिव्यक्ति का मूल्यांकन करेगा और उस अभिव्यक्ति के आउटपुट के साथ खुद को प्रतिस्थापित करेगा (बहुत कुछ बैकटिक्स जैसे बैश में)
  • ls *.txt ग्लोब से मेल खाने वाली सभी फाइलों का FileInfo ऑब्जेक्ट मिल जाता है *.txt
  • क्योंकि PowerShell ऑब्जेक्ट ओरिएंटेड है, हमें प्रत्येक FileInfo ऑब्जेक्ट का पूरा नाम आउटपुट करना होगा। बस PowerShell में एक विशेषता / संपत्ति का नामकरण इसे डिफ़ॉल्ट रूप से आउटपुट करता है। % { $_.FileName }हमारे लिए वही करता है। %सभी तत्वों पर लूप्स द्वारा लौटाए गए lsऔर प्रत्येक ऑब्जेक्ट को आउटपुट करता है FileName।

2
अलख पीएस निश्चित रूप से रीकस्ट को पूरा करने में सक्षम है और इसके साथ परिचित होने की सलाह ध्वनि है - यह उतना आसान नहीं है जितना आप सुझाव देते हैं। रनिंग start notepad++ *.txt(सभी टेक्स्टफाइल्स खोलने के इरादे से - नोटपैड ++ का उपयोग किया जाता है क्योंकि यह कई नामों को संभालता है) आपको कहीं नहीं मिलेगा
wmz

1
आप इसके साथ वर्कअराउंड कर सकते हैं dir *.txt | % { notepad++.exe $_ }। मैंने कोशिश की कि साधारण नोटपैड के साथ, क्योंकि मेरे पास नोटपैड ++ नहीं है, और यह काम करता है। कमांड वर्तमान निर्देशिका में सभी txt फ़ाइलों की एक सूची प्राप्त करता है, सूची को अगले कमांड पर जाता है जो सूची से गुजरता है और पैरामीटर के रूप में फ़ाइल नाम के साथ नोटपैड ++ निष्पादित करता है।
12x12

हां, लेकिन यह समकक्ष नहीं है। सूचीबद्ध स्ट्रिंग्स में grep "a b c"से किसी को खोजने के बारे में सोचें , जहां "ab c" सूची का विस्तार किया जाएगा
wmz

5
पैरामीटर के रूप में मदों की एक सूची के साथ एक कमांड चलाना पैरामीटर के रूप में एक सूची से प्रत्येक तत्व के साथ कई बार कमांड चलाने के बराबर नहीं है । एक और उदाहरण: copy a+b+c resultऔर copy a result copy b result copy c result। (और उपयोगिता जैसे grep PS में मौजूद है, इसे कहा जाता है select-string)
wmz

1
upvoted, btw यह एक दया है कि ओपी को समझाने के लिए झंकार करने की परवाह नहीं है ...
wmz

8

यह आपको एक सूची देगा और नामांकित चर में भी डाल देगा expanded_list। इसे बैच फ़ाइल में रखें और साथ चलाएं myBatchFile name myPattern। यदि स्थान शामिल हैं तो उद्धरण चिह्नों के साथ पैटर्न संलग्न करें। फाइलों से मेल खाता है, कोई डायर नहीं। मापदंडों के बिना भागो सभी से मेल खाता है।

@echo off
set expanded_list=
for /f "tokens=*" %%F in ('dir /b /a:-d "%~1"') do call set expanded_list=%%expanded_list%% "%%F"

echo expanded_list is: 
echo %expanded_list%

फिर आप के साथ कमांड चला सकते हैं my_command_exec %expanded_list%

चेतावनी! Cmd चर का अधिकतम आकार 8191 अक्षर (XP आगे) है, इसलिए इसे ओवरफ्लो करना संभव है! आप हमेशा पूरी सूची देने के लिए उपयोगिता पर भरोसा नहीं कर सकते। दूसरी ओर, अधिकतम cmd लाइन की लंबाई भी 8191 है, इसलिए आप इसे वैसे भी निष्पादित नहीं कर पाएंगे।


ध्यान दें कि यदि कोई तर्क निर्दिष्ट नहीं किया जाता है, तो विस्तारित_सूची वर्तमान निर्देशिका में सभी फ़ाइलों पर सेट हो जाएगी जो हो सकती है या नहीं हो सकती है, इसलिए ऐसा हो सकता है कि कोई तर्क के लिए चेक जोड़ना चाहें (उदाहरण के लिए "% 1" == "" ...)
जेसनएम 1

3

यह cmd.exe में काम करता है

dir /b *.ext

या

echo | dir /b *.ext

यह केवल फ़ाइल नाम के लिए काम करता है, पथ का कोई हिस्सा नहीं। उदाहरण के लिए dir /b TortoiseSVN\bin\sv*.exeदिखाई देगा svn.exeऔर svnadmin.exe। लेकिन dir /b TortoiseSVN\bi*\svn.exeएक सिंटैक्स त्रुटि दिखाता है।
स्टाइलफुल

1
जाँच करें dir /s /b। इससे आपको पूरा रास्ता मिल जाता है।
पश्चिमीगंज २un

3

ध्यान दें, यह एक अलग थ्रेड user619818 और स्टाइलफेल में पोस्टर्स के लिए टिप्पणी है)

डीआईआर एक विशिष्ट प्रकार से मेल खाने वाली फ़ाइलों के लिए सभी उपनिर्देशिकाओं की खोज कर सकता है और कर सकता है।

नोट: रूट निर्देशिका यह जांचने के लिए कि सभी उपनिर्देशिकाएँ किसके अधीन हैं, "C: \ My Program \ Root \" माना जाता है क्योंकि लेखक ने एक पथ का नाम नहीं दिया था जिसके तहत ये निर्देशिकाएँ स्थित हैं

DIR /B /S "C:\My Program\Root\*.ext"

यह स्रोत फ़ाइलों का पूर्ण फ़ाइल पथ और फ़ाइल नाम देगा।

यदि आप केवल फ़ाइल नाम चाहते हैं, तो आपको निम्नानुसार करना होगा

FOR /F "Tokens=*" %A IN ('DIR /B /S "C:\My Program\Root\*.ext"') DO @( Echo.%~nxA )

इसलिए आप इन सभी फ़ाइलों को "C: \ My Program \ Root \ Sub निर्देशिकाएँ \ *। ext" से "D: \ Singlefolder \ *।" में ले जाना चाहते हैं।

FOR /F "Tokens=*" %A IN ('DIR /B /S "C:\My Program\Root\*.ext"') DO @( MOVE "%~A" "D:\Singlefolder\%~nxA" /Y )

आशा है कि भविष्य में दूसरों की मदद करें। :)


1

यह पुराना है, लेकिन विंडोज़ के लिए लिनक्स सबसिस्टम के साथ, अब आपके PATH में बैश होना बहुत आम बात है। अगर ऐसा है, तो यह आपके लिए यह काम कर सकता है:

bash -c 'cat *.txt'

ध्यान दें कि एकल उद्धरण Windows cmd में विशेष नहीं हैं , इस प्रकार यदि आप cmd से उपरोक्त कमांड चलाते हैं तो यह काम नहीं करेगा। और यह
सिग्विन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.