পাওয়ারশেল ব্যবহার করে কোনও ডিরেক্টরিতে ফাইলগুলি লুপ করুন


243

ডিরেক্টরিতে থাকা সমস্ত। লগ ফাইলগুলি দেখতে কেবল একটি ফাইল নয়, তবে আমি নীচের কোডটি কীভাবে পরিবর্তন করতে পারি?

আমাকে সমস্ত ফাইল লুপ করতে হবে এবং "স্টেপ 4" বা "ধাপ 9" না থাকা সমস্ত লাইন মুছতে হবে। বর্তমানে এটি একটি নতুন ফাইল তৈরি করবে, তবে আমি for eachএখানে লুপটি কীভাবে ব্যবহার করব তা নিশ্চিত নই (নবাগত)।

আসল ফাইলগুলির নাম দেওয়া হয়েছে: 2013 09 03 00_01_29.log । আমি আউটপুট ফাইলগুলিকে হয় সেগুলি ওভাররাইট করতে চাইছি বা একই নামটি "আউট" দিয়ে যুক্ত করতে চাই।

$In = "C:\Users\gerhardl\Documents\My Received Files\Test_In.log"
$Out = "C:\Users\gerhardl\Documents\My Received Files\Test_Out.log"
$Files = "C:\Users\gerhardl\Documents\My Received Files\"

Get-Content $In | Where-Object {$_ -match 'step4' -or $_ -match 'step9'} | `
Set-Content $Out

উত্তর:


363

একবার চেষ্টা করে দেখুন:

Get-ChildItem "C:\Users\gerhardl\Documents\My Received Files" -Filter *.log | 
Foreach-Object {
    $content = Get-Content $_.FullName

    #filter and save content to the original file
    $content | Where-Object {$_ -match 'step[49]'} | Set-Content $_.FullName

    #filter and save content to a new file 
    $content | Where-Object {$_ -match 'step[49]'} | Set-Content ($_.BaseName + '_out.log')
}

ধন্যবাদ। বেসনেম অংশটি (সংস্করণ 1) কাজ করে না - তবে আমি প্রথমে পুরো ফাইলটির ব্যাকআপ তৈরি করে তারপরে মূল ফাইলটিতে পরিবর্তন করে পরিচালনা করেছিলাম।
ব্যবহারকারী 2725402

6
ভি 1 এর জন্য আপনি নীচের নামটি বের করতে নিম্নলিখিতগুলি ব্যবহার করতে পারেন: [io.path] :: GetFileNameWithoutExistance ($ নাম)
শে লেভি

যদি আমি প্রতিস্থাপন BaseNameসঙ্গে FullNameআমি আমি কি চাই পেতে।
এম--

78

যে ডিরেক্টরিতে আপনি ব্যবহার করতে পারেন সেটির সামগ্রী পেতে

$files = Get-ChildItem "C:\Users\gerhardl\Documents\My Received Files\"

তারপরে আপনি এই পরিবর্তনশীলটিও লুপ করতে পারেন:

for ($i=0; $i -lt $files.Count; $i++) {
    $outfile = $files[$i].FullName + "out" 
    Get-Content $files[$i].FullName | Where-Object { ($_ -match 'step4' -or $_ -match 'step9') } | Set-Content $outfile
}

এটি রাখার আরও সহজ উপায় হ'ল foreachলুপ (@ সোয়াপী এবং @ মার্কস্চুলিথেসকে ধন্যবাদ):

foreach ($f in $files){
    $outfile = $f.FullName + "out" 
    Get-Content $f.FullName | Where-Object { ($_ -match 'step4' -or $_ -match 'step9') } | Set-Content $outfile
}

এটি "আউট.লগ" নামে একটি আউটপুট ফাইল তৈরি করে। আমি কীভাবে প্রতিটি ইনপুট ফাইলের জন্য পৃথক আউটপুট ফাইল তৈরি করতে পারি?
ব্যবহারকারী 2725402

@ ব্যবহারকারী 2725402 আমি একটি ইনপুট নির্ভরশীল আউটপুট ফাইল যুক্ত করেছি যা <ইনপুট ফাইলের নাম> আউট
পিভিট

আমি কী ভুল করছি তা নিশ্চিত নয় তবে এটি কাজ করছে না - আমি এখন কোনও আউটপুট ফাইল পাচ্ছি না (এবং কোনও ত্রুটি নেই): $files = Get-ChildItem "C:\Users\gerhardl\Documents\My Received Files\" $files | Where-Object { $outFile = $_.Name + "out" Get-Content $_.FullName | Where-Object { $_ -match 'step4' -or $_ -match 'step9' } | Set-Content $outFile }
ব্যবহারকারীর 2525402

2
আপনিও করতে পারেনforeach ($f in Get-ChildItem "C:\Users\gerhardl\Documents\My Received Files\") { ... }
সাপী

1
বা ব্যবহার করুনForEach ($f in $files){...}
মার্ক শুলথিস

31

যদি আপনাকে কোনও বিশেষ ধরণের ফাইলের জন্য ডিরেক্টরিতে পুনরাবৃত্তি করতে হয় তবে নীচের কমান্ডটি ব্যবহার করুন, যা docফাইল টাইপের সমস্ত ফাইল ফিল্টার করে

$fileNames = Get-ChildItem -Path $scriptPath -Recurse -Include *.doc

যদি আপনার একাধিক ধরণের ফিল্টারেশন করতে হয় তবে নীচের কমান্ডটি ব্যবহার করুন।

$fileNames = Get-ChildItem -Path $scriptPath -Recurse -Include *.doc,*.pdf

এখন $fileNamesপরিবর্তনশীল এমন একটি অ্যারে হিসাবে কাজ করুন যা থেকে আপনি আপনার ব্যবসার লজিকটি লুপ করতে এবং প্রয়োগ করতে পারেন।


আমাকে কী উত্সাহিত করেছিল তা হ'ল লুকানো এবং / অথবা সিস্টেম ফাইলগুলি বাদ দেওয়া। এগুলি দেখতে -Forceআপনাকে গেট-চাইল্ড আইটেমের জন্য প্যারামিটার ব্যবহার করতে হবে । এটির ডকটি ডকস.মাইক্রোসফটকম /en-us/powershell/module/ … এ দেখুন ।
টিল_বি

-6

অন্যান্য উত্তরগুলি দুর্দান্ত, আমি কেবল যুক্ত করতে চাই ... পাওয়ারশেলে একটি পৃথক পদ্ধতির ব্যবহারযোগ্য: GNUWin32 ব্যবহারগুলি ইনস্টল করুন এবং লাইনগুলি দেখার জন্য গ্রেপ ব্যবহার করুন / আউটপুটটি ফাইলটিকে http://gnuwin32.sourceforge.net/ এ পুনঃনির্দেশ করুন

এটি প্রতিবার নতুন ফাইলটিকে ওভাররাইট করে:

grep "step[49]" logIn.log > logOut.log 

আপনি লগইন ফাইলটি ওভাররাইট করে ডেটা রাখতে চান এমন ক্ষেত্রে এটি লগ আউটপুট সংযোজন করে:

grep "step[49]" logIn.log >> logOut.log 

দ্রষ্টব্য: বিশ্বব্যাপী GNUWin32 ব্যবহার করতে সক্ষম হতে আপনাকে আপনার সিস্টেমের পথে বিন ফোল্ডার যুক্ত করতে হবে।


18
এই প্রশ্নটি ইউনিক্স নয়, পাওয়ারশেল হিসাবে ট্যাগ হয়েছে
স্টিভিসি

2
হ্যাঁ. একথাও ঠিক যে। আমার নেওয়া মোটামুটি সহজ ছিল: আপনি উইন্ডোজে GNUWin32 ব্যবহার করতে পারবেন তাই আপনি পাওয়ারশেলের * নিক্স সরঞ্জামগুলি সহজেই ব্যবহার করতে পারেন। কাজ করে। কেউ কখনও বলেনি, উত্তরটি পুরোপুরি পাওয়ারশেলের স্থানীয় হতে হবে। এমনকি যদি তারা তা করে ফেলে তবেও আপনি সরাসরি পাওয়ারশেল থেকে উইন 32 ইউটিলেস কল করতে পারেন। উপলব্ধ এবং সামঞ্জস্যপূর্ণ যা ব্যবহার করে এএফআইকি আসলে কোনও খারাপ জিনিস নয়।
ব্যবহারকারী1628658

2
আমি আমার আগের মন্তব্যটি সম্পাদনা করতে পারতাম, তবে আমি 5 মিনিটের সীমাটি পেরিয়ে গেলাম: স্টিভসি: আপনি কি বলছেন যে উইন্ডোজের অধীনে সূক্ষ্মভাবে কাজ করে এমন জিএনইউ সরঞ্জামগুলি অন্তর্ভুক্ত করা কোনওভাবে পাওয়ারশেলকে অস্বীকার করছে? এটা একটা জিনিস। আমি বুঝতে পেরেছি যে পাওয়ারসলে খাঁটিভাবে এটি কাজ করা স্বল্প মেয়াদে আরও উত্পাদনশীল হতে পারে। দীর্ঘমেয়াদে সম্ভাবনার প্রসারণ করার ক্ষেত্রে আরও বেশি যোগ্যতা রয়েছে। আপনি আরও বিকল্প যুক্ত করেছেন এবং সাইগউইনের মতো কোনও লিনাক্স এমুলেটর ছাড়াই উইন্ডোজ এবং পাওয়ারশলে পুরোপুরি কাজ করছেন। সুতরাং আমি যখন আপনার রিজার্ভেশনটি বুঝতে পারি, তখন আমি দ্বিমত পোষণ করি।
ব্যবহারকারী1628658

5
প্রশ্নটি পাওয়ারশেলের সন্ধানের বিষয়ে ছিল, অন্যান্য ভাষার যে সংখ্যা ব্যবহার করা যেতে পারে তা নয়।
স্টিভসি

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