উইন্ডোকার্ড পাথগুলি প্রসারিত করার জন্য উইন্ডোজের সিএমডি শেল পাওয়ার কোনও উপায় আছে কি?


37

কখনও কখনও, ওয়াইল্ডকার্ডের পথগুলি প্রসারিত করতে সিএমডি শেলের অক্ষমতা সত্যিই কোনও অসুবিধা হতে পারে। আমাকে একটি ডিরেক্টরিতে 100 টি ফাইল একটি প্রোগ্রামে পাস করতে হয়েছিল, এবং * .ext টাইপ করতে পারিনি। পরিবর্তে, আমি একটি ফাইলগুলিতে তালিকাটি ছুঁড়ে ফেলার জন্য মিংডাব্লু এর 'এলএস' ব্যবহার করেছি, তারপরে ফাঁকা স্থানগুলির সাথে নতুন লাইনগুলি প্রতিস্থাপন করেছি, অনুলিপি করে সেমিডিতে আটকানো। বেশ দুঃস্বপ্ন।

আমি সন্দেহ করি উত্তরটি হ'ল না, তবে কেউ কি এটিকে মোকাবেলা করেছেন বা এটিকে আরও সহজ করার জন্য কোনও উপায় নিয়ে এসেছেন?


2
আপনি কি এর পরিবর্তে পাওয়ারশেলের মতো কিছু ব্যবহার বিবেচনা করেছেন?

I suspect the answer will be no, but has anyone dealt with this or come up with any way to make this easier? আসলে, আমার বিপরীত সমস্যা হচ্ছে, আমি কমান্ড-ইন্টারপ্রেটারকে তার তালিকাটিকে স্ট্রিং হিসাবে গণ্য করার জন্য এবং এটিকে ওয়াইল্ডকার্ড হিসাবে বাধা দেওয়া থেকে বিরত করার একটি উপায় বের করার চেষ্টা করছি । উদাহরণস্বরূপ, for %i in (foobar baz really?) do @echo %iগত আইটেম (বিবেচনা করবে really?) একটি ফাইলের নাম ওয়াইল্ডকার্ড রূপে, এবং এটি লাফালাফি যদি এই নামে কোনো ফাইল really1, reallyzইত্যাদি ☹
Synetech

1
@ সাইনটেক - ?উইন্ডোজ ফাইল সিস্টেমে ফাইল নামগুলির জন্য আইনী চরিত্র নয়। চরিত্রটি কেবল ওয়াইল্ডকার্ড হিসাবে ব্যাখ্যা করা যায়। দেখুন ফাইল, পাথ, এবং নামস্থান নামকরণ দুটিই MSDN এবং ওয়াইল্ডকার্ড অক্ষর ব্যবহার করে TechNet হবে।
jww

উত্তর:


18

ডস এবং ফলস্বরূপ উইন্ডোজ ' cmd.exeকখনই শেল দ্বারা ওয়াইল্ডকার্ড প্রসারণ সমর্থন করে না। এটি সর্বদা প্রসারিত করতে আবেদনের উপর নির্ভর করে।

এর অর্থ আপনি যদি এমন অ্যাপ্লিকেশন ব্যবহার করেন যা প্রসারণ সমর্থন করে না তবে আপনাকে সর্বদা অন্য রুটটি সন্ধান করতে হবে। আপনি করতে পারেন:

  • আপনার আগ্রহী সমস্ত ফাইলের বিরুদ্ধে কিছু কমান্ড চালানোর জন্য ফর লুপ ব্যবহার করুন
  • ব্যবহার করুন dir /b > list.txtব্যবহার করতে dirকমান্ড সম্প্রসারণ সম্পাদন এবং একটি টেক্সট ফাইলে ফাইলের তালিকা করা (আপনি তারপর এক্সেল সূত্র ভালো কিছু ব্যবহার করতে পারে যদি সত্যিই পেস্ট আদেশগুলি একটি তালিকা উত্পাদন করতে মরিয়া করছি cmd, অথবা আপনি এক্সেল ব্যবহার করতে পারে কক্ষগুলি স্থানান্তর করতে যাতে সমস্ত ফাইলের নাম একই লাইনে থাকে))

তিনি ব্যাখ্যা করেছিলেন যে একটি ফাইলের মধ্যে ডিরের ফলাফলগুলি আউটপুট আউট করা এবং ম্যানুয়ালি ফিল্টারিং এবং অনুলিপি প্রক্রিয়াজাত করা দুঃস্বপ্ন হবে। ডাব্লুএমজেড এর উত্তর এবং অবশ্যই আমার কোনও ফাইলের সামগ্রী নিজেই ফিল্টার না করে কাজ করবে।
wullxz

1
@ ওউলক্সজ: সম্ভবত, তবে পাওয়ারশেলের সাথে অপরিচিত কারও কাছে এটি একত্যাগ হিসাবে করতে চাইলে এটি যথেষ্ট দ্রুততর হতে পারে - এবং এই সাইটের পিছনে থাকা ধারণাটি সমস্ত দক্ষতা স্তরের লোকদের এখন এবং এখানে উল্লেখ করার জন্য দরকারী সমাধানগুলি সরবরাহ করা ভবিষ্যত, সুতরাং সত্যিই আমাকে বলার দরকার নেই কারণ আপনি মনে করেন আমার উত্তরটি আপনার মতো উত্তম নয়।
মালভাইনাস

1
"ডস, এবং ফলস্বরূপ উইন্ডোজ'র সেমিডি.এক্স.সি, কখনও শেল দ্বারা ওয়াইল্ডকার্ড প্রসারণ সমর্থন করে না।" - মাইক্রোসফ্ট অনুসারে সত্য নয়। টেকনেটে ওয়াইল্ডকার্ড অক্ষর ব্যবহার করা দেখুন । (তবে আমি মনে করি আপনি অনুশীলনে ঠিক আছেন: ও। অন্যথায়, আমি এখানে ফাইলগুলি কেন মেলে না তা
জানার

1
@jww: আপনার পোস্ট করা লিঙ্কটি ওয়াইল্ডকার্ডের অক্ষরের মানকতার ব্যাখ্যা দেয়, তবে শেল দ্বারা তাদের প্রসারিত করার কোনও উল্লেখ আমি দেখতে পাচ্ছি না। ইউএনআইএক্স (এবং পরবর্তী লিনাক্স এবং ম্যাক) এর বিপরীতে, মাইক্রোসফ্ট প্রতিটি স্বতন্ত্র অ্যাপ্লিকেশন প্রয়োগের জন্য ওয়াইল্ডকার্ড প্রসারিত করে, কমান্ড লাইন প্যারামিটারগুলি হ'ল মাধ্যমে পাস করে।
মালভাইনাস

1
ডস কমান্ড 'ডায়ার ফাইলস্পেক / বি' সত্যিই ভাল কাজ করে, কারণ এটি প্রতি লাইনে ফাইলগুলির একটি তালিকা তৈরি করে। অতিরিক্ত '/ গুলি' স্যুইচ সহ ফাইলের নামগুলি সম্পূর্ণরূপে যোগ্য (পরম), এবং সহজেই একটি লুপের মাধ্যমে অন্য কোনও কমান্ড লাইন প্রোগ্রামে দেওয়া যেতে পারে যা কোনও ফাইলের নাম নেয়। এটি আমাদের পক্ষে সবচেয়ে ভাল, যেহেতু উইন্ডোজটির সঠিক গ্লোববিং বৈশিষ্ট্য নেই।
ডেভিড এ। গ্রে

9

উইন্ডোজ on এ কেবলই পাওয়ারশেল ব্যবহার করুন, যা ইনস্টল করা আছে Pow পাওয়ারশেলটি সিএমডি কমান্ড চালাতে সক্ষম এবং কোনও পথের যে কোনও জায়গায় ওয়াইল্ডকার্ড বুঝতে পারে।

পাওয়ারশেল শুরু করতে আপনার শুরু মেনু অনুসন্ধান বাক্সে "পাওয়ারশেল" টাইপ করুন এবং এন্টার টিপুন।


যদি অ্যাপ্লিকেশনটিতে সমস্ত ফাইলের নামের সাথে একটি স্ট্রিং আশা করে তবে এটি সঠিক স্ক্রিপ্ট:

$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 - অ্যাপ্লিকেশন কল করে এবং ফাইল তালিকাটি এতে পাস করে

এমনকি আপনি যাও recursively যোগ করে একটি ফাইল প্যাটার্ন জন্য অনুসন্ধান করতে পারেন -recurseকরতে ls *.txtতাই সম্পূর্ণ কোডটি এই মত দেখাবে:

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

সম্পাদনা:
চুলকানি এড়াতে, lsএবং dirহয় alias লেখা Get-ChildItemএবং %একটি ওরফে হয় ForEach-Object। আমি আমার কোডটি এলিয়াসগুলির সাথে ব্যবহার করি কারণ এটি সংক্ষিপ্ত।

সম্পাদনা 2018/04/25:
2012 এ ফিরে আমি পাওয়ারশেলের সাথে মোটামুটি নতুন এসেছি। অবশ্যই আরও সহজ উপায় আছে যদিও এটি ইউনিক্স / লিনাক্সের গ্লোব সম্প্রসারণের সামর্থ্যের মতো সহজ নয়:

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

ব্যাখ্যা:

  • $ () প্রথমে ভিতরে প্রকাশটি মূল্যায়ন করবে এবং সেই অভিব্যক্তির আউটপুট দিয়ে নিজেকে প্রতিস্থাপন করবে (অনেকটা ব্যাকটিক্স যেমন ব্যাশে করে)
  • ls *.txt বিশ্বব্যাপী মেলে এমন সমস্ত ফাইলের ফাইলআইনফো বস্তু পায় *.txt
  • পাওয়ারশেল যেহেতু অবজেক্ট ওরিয়েন্টড, তাই আমাদের প্রতিটি ফাইলআইএনফো অবজেক্টের পুরো নাম আউটপুট করতে হবে। কেবল পাওয়ারশেলের একটি বৈশিষ্ট্য / সম্পত্তি নামকরণ এটি ডিফল্টরূপে আউটপুট করে। % { $_.FileName }আমাদের জন্য যে না। %সমস্ত উপাদান দ্বারা লুপগুলি ফিরে আসে lsএবং প্রতিটি বস্তুর ফাইলনাম আউটপুট করে।

2
আলহফ পিএস অবশ্যই উত্তরটি পূরণ করতে সক্ষম এবং এর সাথে পরিচিত হওয়ার পরামর্শটি যথাযথ - এটি আপনার পরামর্শ অনুসারে সহজ নয়। চলমান start notepad++ *.txtব্যবহৃত Notepad ++ যেমন - (উদ্দেশ্য সঙ্গে সব textfiles খুলতে না একাধিক নামের হ্যান্ডেল) আপনি কিছুই অর্জন করতে পারবে
wmz

1
আপনি যে এর সাথে কাজ করতে পারে dir *.txt | % { notepad++.exe $_ }। আমি সাধারণ নোটপ্যাড দিয়ে চেষ্টা করেছি, কারণ আমার নোটপ্যাড ++ নেই এবং এটি কার্যকর। কমান্ডটি বর্তমান ডিরেক্টরিতে সমস্ত txt ফাইলের একটি তালিকা পেয়েছে, পরবর্তী কমান্ডে তালিকাটি পাস করে যা তালিকার মধ্য দিয়ে লুপ হয় এবং নোটপ্যাড ++ ফাইলের সাথে প্যারামিটার হিসাবে চালায়।
wullxz

হ্যাঁ, তবে এটি সমতুল্য নয়। মনে সম্পর্কে grep "a b c"এটি কোন তালিকাভুক্ত স্ট্রিং, যেখানে "AB গ" তালিকা প্রসারিত করা হবে
wmz

5
কমান্ড চলমান প্যারামিটার হিসাবে আইটেম একটি তালিকা সঙ্গে কমান্ড চালানোর সমমানের নয় প্রতিটি উপাদান দিয়ে একাধিক বার একটি প্যারামিটার হিসাবে একটি তালিকা থেকে। আর একটি উদাহরণ: copy a+b+c resultএবং copy a result copy b result copy c result। (এবং গ্রেপের মতো ইউটিলিটি পিএস-তে বিদ্যমান থাকে, এটি বলা হয়select-string )
wmz

1
আপভোটেড, বিটিডব্লিউ এটি দুঃখের বিষয় যা ওপি ব্যাখ্যা দেওয়ার জন্য চিম খাওয়ার যত্ন করে না ...
ডাব্লুএমজেড

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%

সতর্কবার্তা! সেমিডিড ভেরিয়েবলের সর্বাধিক আকার 8191 টি অক্ষর (XP এর পরে), সুতরাং এটির ওভারফ্লো করা সম্ভব! সর্বদা আপনাকে সম্পূর্ণ তালিকা দেওয়ার জন্য আপনি ইউটিলিটির উপর নির্ভর করতে পারবেন না। অন্যদিকে, সর্বাধিক সেন্টিমিটার লাইনের দৈর্ঘ্যও 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। এটি আপনাকে পুরো পথ দেয়।
ওয়েস্টার্নগুন

3

দ্রষ্টব্য, এটি পৃথক থ্রেড ব্যবহারকারী 619818 এবং স্টাইলে পোস্টারগুলিতে মন্তব্য করা হয়েছে)

ডিআইআর একটি নির্দিষ্ট ধরণের সাথে মেলে এমন ফাইলগুলির জন্য সমস্ত উপ-ডিরেক্টরি অনুসন্ধান করতে পারে এবং করতে পারে।

দ্রষ্টব্য: সমস্ত উপ-ডিরেক্টরিগুলি যার অন্তর্ভুক্ত রয়েছে তা যাচাই করার জন্য রুট ডিরেক্টরিটি "সি: \ আমার প্রোগ্রাম \ রুট \" বলে মনে করা হয় কারণ লেখক এই ডিরেক্টরিগুলির মধ্যে কোনও পাথের নাম দেয় নি under

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

এটি উত্স ফাইলগুলির পুরো ফাইল পাথ এবং ফাইলের নাম দেবে।

আপনি যদি কেবল ফাইলের নাম চান তবে আপনাকে নীচের মতো করতে হবে

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

সুতরাং ধরে নিই যে আপনি "সি: \ আমার প্রোগ্রাম oot রুট \ উপ ডিরেক্টরিগুলি। *। এক্সট্রাক্ট" থেকে "ডি: \ সিঙ্গলফোল্ডার \ *। এক্সট্রাক্ট" - এ এই ফাইলগুলি সরাতে চান আপনি কেবল এটি করুন:

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'

মনে রাখবেন যে সিঙ্গেল কোটগুলি উইন্ডোজ সেন্টিমিডিতে বিশেষ নয় , সুতরাং আপনি যদি সিএমডি থেকে উপরের কমান্ডটি চালান তবে এটি কার্যকর হবে না। এবং এটি
সাইগউইন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.