ব্যাচ: ফাইল এক্সটেনশন সরান


155

উইকিপিডিয়া থেকে আমার কাছে নিম্নলিখিত ব্যাচের স্ক্রিপ্ট রয়েছে:

@echo off
    for /R "C:\Users\Admin\Ordner" %%f in (*.flv) do (
    echo %%f
)
pause

লুপে এক্সটেনশন সহ সমস্ত ফাইল প্রতিধ্বনিত হয়, তবে আমি ফাইল (গুলি) দিয়ে কিছু পদক্ষেপ নিতে চাই যেখানে আমার এক্সটেনশন ছাড়াই এক সময় ফাইল প্রয়োজন এবং এক্সটেনশনের সাথে এক সময়। আমি কিভাবে এই দুটি পেতে পারি?

আমি সমাধানগুলির সন্ধান করেছি কিন্তু আমি এর একটিও পাই না। আমি ব্যাচের একজন বাস্তব নবাগত ...

উত্তর:


309

%%~nfফাইলের নামটি কেবলমাত্র রেফারেন্সের জন্য বর্ণিত হিসাবে পেতে ব্যবহার করতে পারেন for:

@echo off
    for /R "C:\Users\Admin\Ordner" %%f in (*.flv) do (
    echo %%~nf
)
pause

নিম্নলিখিত বিকল্পগুলি উপলব্ধ:

সংশোধক বর্ণনার সাথে পরিবর্তনীয়

% ~ আমি% I প্রসারিত করি যা কোনও পার্শ্ববর্তীকে সরিয়ে দেয় 
                        উদ্ধরণ চিহ্ন ("").
% ~ fI% I সম্পূর্ণরূপে যোগ্য পাথের নামে প্রসারিত করে।
% ~ dI% I কেবলমাত্র ড্রাইভ লেটারে প্রসারিত করে।
% ~ pI% I কে কেবল একটি পথে প্রসারিত করে।
%। nI% I কেবল একটি ফাইলের নামে প্রসারিত করে।
% ~ xI% I কে কেবলমাত্র একটি ফাইল এক্সটেনশনে প্রসারিত করে।
% ~ sI কেবল সংক্ষিপ্ত নাম রাখার জন্য পথ প্রসারিত করে।
% ~ aI% I টি ফাইলের বৈশিষ্ট্যগুলিতে প্রসারিত করে।
% ~ tI% I টি ফাইলের তারিখ এবং সময়কে প্রসারিত করে।
% ~ zI% I কে ফাইলের আকারে প্রসারিত করে।
% ~ $ পথ: আমি PATH পরিবেশে তালিকাভুক্ত ডিরেক্টরিগুলি অনুসন্ধান করি 
                        ভেরিয়েবল এবং এর সম্পূর্ণরূপে যোগ্য নামের% 1 কে প্রসারিত করে 
                        প্রথমটি পাওয়া গেল। যদি পরিবেশের পরিবর্তনশীল নাম হয়
                        সংজ্ঞায়িত করা হয়নি বা ফাইল অনুসন্ধানের দ্বারা খুঁজে পাওয়া যায় নি,
                        এই সংশোধকটি খালি স্ট্রিংয়ে প্রসারিত হয়।    

8
কেবলমাত্র একটি দ্রষ্টব্য নোট: উপরের উদাহরণে %% f এমন কিছু হবে C:\Users\Admin\Ordner\foo.flvএবং %% ~ nf আপনাকে দিবে foo। আপনি যদি এক্সটেনশনটি বাদ দিয়ে সমস্ত কিছু %% ~ df %% ~ pf %% ~ n ব্যবহার করতে চান যা আপনাকে দেয়C:\Users\Admin\Ordner\foo
অহমরাইট

8
@ এহম্ব্রিট লেট মন্তব্য করেছেন, তবে আমার ধারণা এই ব্যবহারটি %%~dpnfএকটি ছোট বিকল্প হতে পারে।

সংশোধক / বিবরণ সারণির জন্য ধন্যবাদ ডর্ক। আমার কেস %1ব্যাচের স্ক্রিপ্টে প্যারাম থেকে এক্সটেনশন ছাড়াই ফাইলটির নাম পাচ্ছিল । echo %~n1আমি পরে কি ছিল।
ডেভ পাইল

26

আপনার ভেরিয়েবলের ফাইলটি যদি বাস্তবে না থাকে তবে FORপদ্ধতির কাজ হবে না। যে কৌশলটি আপনি ব্যবহার করতে পারেন, যদি আপনি এক্সটেনশনের দৈর্ঘ্য জানেন, তবে একটি সাবস্ট্রিং নিচ্ছেন:

%var:~0,-4%

এর -4মানে হল যে শেষ 4 টি সংখ্যা (সম্ভবতঃ .xt ) কেটে যাবে।


এটি আমার পক্ষে কাজ করছে না (উইন 8.1 তে) - echo %f:~0,-4%প্রশ্নটিতে ব্যবহৃত উদাহরণের প্রসঙ্গে চেষ্টা করার সময় আমি এটির ভুল বুঝতে পারি । আমি কি ভুল করছি?
ওল্ফ

2
স্পষ্টতই এটি "নরমাল" ভেরিয়েবলের জন্য কাজ করে, ভেরিয়েবলের জন্য নয় (বা সম্ভবত আমি সঠিক বাক্য গঠন জানি না)। যাইহোক এটি ওপি উদাহরণের প্রসঙ্গে কাজ করবে: SET fl=%%fএবং তারপরেecho %fl:~0,-4%
ওহাদ স্নাইডার

@ ওল্ফ আপনার লুপ ভেরিয়েবলের মান একটি সাধারণ ভেরিয়েবলের মধ্যে সেট করতে হবে তারপরে স্ট্রিং সাবস্টিটিউশন / ট্রান্সকেশন সাধারণ ভেরিয়েবেলে করতে হবে
ফুক্লভ

পর্যাপ্ত ক্ষেত্রে বেশি, এক্সটেনশন দৈর্ঘ্য 3 সমান হয় না বা অজানা। ফাইলটি না থাকলেও আপনি এখনও একটি ব্যবহার করতে পারেন, আমার উত্তর দেখুন।
মার্জ করুন

14

আমি উইন্ডোজ সেন্টিমিডিতেও অপরিচিত, তবে এটি ব্যবহার করে দেখুন:

echo %%~nf

8

এটি সত্যিই দেরি করে দেওয়া প্রতিক্রিয়া, তবে ডিস্কিন্টার্নালস লিনাক্সরেডার নিয়ে '.efs_ntfs' যুক্ত ফাইলগুলিতে এটি নন-এনটিএফএস (FAT32) ডিরেক্টরিতে সংরক্ষণ করে এমন একটি বিশেষ সমস্যা সমাধান করার জন্য আমি এটিকে সামনে নিয়ে এসেছি:

@echo off
REM %1 is the directory to recurse through and %2 is the file extension to remove
for /R "%1" %%f in (*.%2) do (
    REM Path (sans drive) is given by %%~pf ; drive is given by %%~df
    REM file name (sans ext) is given by %%~nf ; to 'rename' files, move them
    copy "%%~df%%~pf%%~nf.%2" "%%~df%%~pf%%~nf"
    echo "%%~df%%~pf%%~nf.%2" copied to "%%~df%%~pf%%~nf"
echo.
)
pause

আমি নিশ্চিত না যে এটি জিজ্ঞাসিত প্রশ্নের উত্তর দিয়েছে, তবে এটি আসলে আমাকে সহায়তা করেছে, ধন্যবাদ!
matan7890

1
@ matan7890 সত্য; অপটি "ফাইল (গুলি)" এর সাথে কীভাবে কিছু পদক্ষেপ নিতে চান তা নির্দিষ্ট করে না [sic], তবে এই ক্রিয়াকলাপগুলির মধ্যে একটিতে তাদের নাম পরিবর্তন করা যেতে পারে, সেক্ষেত্রে আমার উত্তর গৃহীত উত্তরের একটি সম্প্রসারণ।
আগি হামারথিফ

এটি আমার এক বন্ধুকে সহায়তা করেছিল যিনি একটি সংযুক্তি খোলেন এবং .encryptedমুক্তিপণের দাবি সহ তার সমস্ত ফাইল যুক্ত করেছিলেন। স্পষ্টতই আক্রমণকারী স্ক্রিপ্টটি অবশ্যই একটি ব্যাচের ফাইল হতে পারে যা এর বিপরীত এবং .encryptedসমস্ত ফাইলগুলিতে যুক্ত হয়েছিল।
জেগে উঠেছে

1
upvoted কারণ আপনার ড্রাইভ, পাথ, এবং এক্সটেনশন (উল্লেখ %% ~ df প্রয়োগ %% ~ PF %% ~ NF ) যা সবচেয়ে ভালভাবে আউটপুট বর্ণনার অনুরূপ %% চ পরিবর্তে মূল প্রশ্নটি থেকে মাত্র এক্সটেনশন ছাড়া ফাইলের নাম ( %% । nf )
অহমর রাস্তায়

5

আমি যদি এটির পরিবর্তে কোনও ভেরিয়েবল (কোনও ডিরেক্টরি বা বিদ্যমান ফাইলগুলি লুপ না করে) এক্সটেনশনটি ছড়িয়ে দিতে চাই তবে আমি এটি ব্যবহার করছি:

for %%f in ("%filename%") do set filename=%%~nf

আপনি যদি পুরো পথ থেকে এক্সটেনশানটি ছড়িয়ে দিতে চান তবে %%dpnfপরিবর্তে ব্যবহার করুন:

for %%f in ("%path%") do set path=%%~dpnf

উদাহরণ:

(কনসোলে সরাসরি ব্যবহার করুন)

@for %f in ("file name.dat") do @echo %~nf
@for %f in ("C:\Dir\file.dat") do @echo %~dpnf

OUTPUT:

file name
C:\Dir\file

0

চপিং করতে সাইগউইন ব্যাশ ব্যবহার করা

  :: e.g. FILE=basename.mp4 => FILE_NO_EXT=basename
  set FILE=%1
  for /f "delims=" %%a in ('bash -c "FILE=%FILE%; echo ${FILE/.*/}" ') do set FILE_NO_EXT=%%a

0

যদি আপনার ভেরিয়েবলটি একটি আর্গুমেন্ট হয় তবে আপনি কেবল %~dpnযুক্তি নম্বর অনুসরণ করে ব্যবহার করতে পারেন , তাই আপনাকে বিভিন্ন বর্ধনের দৈর্ঘ্যের জন্য চিন্তা করতে হবে না।

উদাহরণস্বরূপ %~dpn0ব্যাচ ফাইলের পথটি এর প্রসার ছাড়াই ফিরে %~dpn1আসবে %1, প্রসার ছাড়াই হবে ইত্যাদি

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