উইন্ডোজ: ফাইলের অনুলিপি / ফাইলের নাম সহ নিয়মিত প্রকাশ?


10

আমি মূলত চালাতে চাই :

C:\>xcopy [0-9]{13}\.(gif|jpg|png) s:\TargetFolder /s

আমি জানি xcopyনিয়মিত-এক্সপ্রেশন ফাইল নাম অনুসন্ধানগুলি সমর্থন করে না।

আমি খুঁজে বের করতে কিভাবে যদি আউট খুঁজে পাচ্ছি না PowerShell টি Cmdletফাইল কপি করতে; এবং যদি এটি হয়, কিভাবে এটি নিয়মিত এক্সপ্রেশন ফাইল নাম মেলানো সমর্থন করে তা সন্ধান করবেন।

কেউ কি পুনরাবৃত্ত ফাইলের অনুলিপি সম্পাদন / রেগেক্স ফাইলের সাথে মিলে ফাইল ফাইলের কোনও উপায় সম্পর্কে ভাবতে পারেন?


1
এটি ঠিক স্ট্যাকওভারফ্লোতে সরানো উচিত?
ব্যবহারকারী 33788

1
@ স্মোকনহীপ: এটি উভয়ই হতে পারে, আমি দেখতে পেয়েছি যে পাওয়ারশেল স্ক্রিপ্টিং একটি পাওয়ার ইউজারের সরঞ্জাম হয়ে উঠছে। এটি একটি এক্সকপি প্রতিস্থাপন প্রশ্ন এবং তারপর একটি স্ক্রিপ্টিং প্রশ্ন বেশি।
ডল্টকনাকল

উত্তর:


5

আমি যখন পারি তখন সমস্ত পাওয়ারশেল কমান্ড ব্যবহার করতে পছন্দ করি। কিছুটা পরীক্ষার পরে, আমি এটি করতে পারি সেরা।

$source = "C:\test" 
$destination = "C:\test2" 
$filter = [regex] "^[0-9]{6}\.(jpg|gif)"

$bin = Get-ChildItem -Path $source | Where-Object {$_.Name -match $filter} 
foreach ($item in $bin) {Copy-Item -Path $item.FullName -Destination $destination}

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

[Edit]

"@ জোহানেস রাসেল" উল্লিখিত হিসাবে, আপনি শেষ দুটি লাইনকে এক লাইনেও কমিয়ে আনতে পারেন।

((Get-ChildItem -Path $source) -match $filter) | Copy-Item -Destination $destination

মূল পার্থক্য হ'ল জোহানসের উপায় অবজেক্ট ফিল্টারিং করে এবং আমার পথটি টেক্সট ফিল্টারিং করে। পাওয়ারশেলের সাথে কাজ করার সময়, অবজেক্টগুলি ব্যবহার করা প্রায় সর্বদা ভাল।

[EDIT2]

@ স্মোকনহ্যাপ উল্লিখিত হিসাবে, উপরের স্ক্রিপ্টগুলি ফোল্ডারটির কাঠামো সমতল করবে এবং আপনার সমস্ত ফাইলকে একটি ফোল্ডারে রাখবে। আমি নিশ্চিত নই যে ফোল্ডারের কাঠামো ধরে রাখে এমন কোনও সুইচ রয়েছে কিনা। আমি-রিকার্স সুইচটি চেষ্টা করেছি এবং এটি কোনও উপকার করে না। আমি এই কাজটি করার একমাত্র উপায় হ'ল স্ট্রিং ম্যানিপুলেশনে ফিরে যাওয়া এবং আমার ফিল্টারে ফোল্ডার যুক্ত করা।

$bin = Get-ChildItem -Path $source -Recurse | Where-Object {($_.Name -match $filter) -or ($_.PSIsContainer)}
foreach ($item in $bin) {
    Copy-Item -Path $item.FullName -Destination $item.FullName.ToString().Replace($source,$destination).Replace($item.Name,"")
    }

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

[EDIT3]

এখন আপনি যদি আপনার সমস্ত কিছু সঠিক হয়ে থাকে তা নিশ্চিত করার জন্য যদি আপনি পথের প্রতিবেদন করতে চান। আপনি "লিখন-হোস্ট" কমান্ডটি ব্যবহার করতে পারেন। এখানে কোডটি যা আপনাকে যা চলছে সে সম্পর্কে আপনাকে কিছু ইঙ্গিত দেবে।

cls
$source = "C:\test" 
$destination = "C:\test2" 
$filter = [regex] "^[0-9]{6}\.(jpg|gif)"

$bin = Get-ChildItem -Path $source -Recurse | Where-Object {($_.Name -match $filter) -or ($_.PSIsContainer)}
foreach ($item in $bin) {
    Write-Host "
----
Obj: $item
Path: "$item.fullname"
Destination: "$item.FullName.ToString().Replace($source,$destination).Replace($item.Name,"")
    Copy-Item -Path $item.FullName -Destination $item.FullName.ToString().Replace($source,$destination).Replace($item.Name,"")
    }

এটি প্রাসঙ্গিক স্ট্রিংগুলি ফিরিয়ে আনবে। যদি আপনি কোথাও কিছু না পান তবে আপনি জানতে পারবেন কোন আইটেমে সমস্যা হচ্ছে।

আশাকরি এটা সাহায্য করবে


মনে রাখবেন যে $item.FullNameসেখানে আপনাকে ব্যবহার করার দরকার নেই - আপনি যদি ফাইলআইনফো অবজেক্টটি পাস করেন তবে উপযুক্ত সম্পত্তি স্বয়ংক্রিয়ভাবে নেওয়া হবে (তবে আপনার উচিত হবে না, যেহেতু পাওয়ারশেলের শক্তি স্ট্রাকচার নয়, কাঠামোগত বস্তুগুলি পাস করার মাধ্যমে আসে)। তদুপরি, আপনি সবকিছুকে একটি একক পাইপলাইনে রাখতে পারেন: ((gci $source) -match $filter) | cp -dest $destination(ব্রেভিটির জন্য কিছুটা অভিযোজিত - পরিবর্তন করতে নির্দ্বিধায়; আমি কেবল বলছি যে foreachসেখানে অপ্রয়োজনীয়)।
জোয়

যখন আমি এটি পরীক্ষা করছিলাম তখন আমি সঠিকভাবে পাইপগুলিতে জিনিসগুলি পেতে পারি না। এটি আমাকে ফোরচ কমান্ড ব্যবহার করতে বাধ্য করে। আমি আপনার কোডটি চেষ্টা করে দেখব কী ঘটে। যে ইশারা জন্য ধন্যবাদ।
ডল্টকনাকল

এটি কি আমার মতো একই সমস্যা আছে যেখানে এটি গন্তব্য ডিরেক্টরিটি ফ্ল্যাট করে দেয়? xcopy সাধারণত গন্তব্য ডিরেক্টরিতে ডিরেক্টরি কাঠামো সংরক্ষণ করবে, তাই না?
ব্যবহারকারী 33788

Copy-Item : Cannot bind argument to parameter 'Path' because it is null
ইয়ান বয়ড

দয়া করে নোট করুন যে Trimঅন্য স্ট্রিংয়ের শেষে থেকে একটি স্ট্রিং অপসারণ করার উদ্দেশ্যে নয়, পরিবর্তে এটি প্যারামিটার স্ট্রিংয়ের অক্ষরগুলির সমস্ত দৃষ্টান্তগুলি স্ট্রিংয়ের শুরু এবং শেষ থেকে সরিয়ে দেয়। আপনার ক্ষেত্রে যদি $item.Nameমূল সি থাকে তবে এটি স্ট্রিংয়ের শুরু থেকে ড্রাইভ লেটার সিও সরিয়ে ফেলবে।
অ্যান্ডিস

3

পাওয়ারশেল সেই কাজের জন্য একটি দুর্দান্ত সরঞ্জাম। অনুলিপি প্রক্রিয়াটির জন্য আপনি অনুলিপি-আইটেমের সিএমডিলেট ব্যবহার করতে পারেন । জটিল অনুলিপি কমান্ডগুলির জন্য আপনি অন্যান্য সেমিডলেটগুলির সাথে এটি পাইপলাইন করতে পারেন, এখানে এমন কেউ আছেন যিনি ঠিক সেটাই করেছেন :)

রেগুলার এক্সপ্রেশন System.Text.RegularExpressions নামস্থান থেকে .NET Regex বর্গ ব্যবহার করেন, আছে দ্রুত কীভাবে এই বর্গ উপর

পাওয়ারশেলের কাছে- ম্যাচ এবং -প্লেস অপারেটরগুলিও রয়েছে যা অনুলিপি-আইটেমের সাথে পাইপলাইনের সময় ব্যবহার করা যেতে পারে

আপনি নিজেই RegEx তৈরি করতে সহায়তার জন্য সরঞ্জামগুলিও রয়েছে, যেমন RegEx বন্ধু


ইমো, -matchএবং প্রবেশের -replaceআগে উল্লেখ করা উচিত System.Text.RegularExpressions.RegEx। কমপক্ষে আমার জন্য, আমি খুব কমই [regex]সরাসরি ব্যবহার করি ; তবে আমি কি ব্যবহার ঘন ঘন -matchএবং -replaceঅপারেটর। নিয়মিত এক্সপ্রেশন তৈরি করার জন্য আমি পাওয়ারশেলকে লিখেছি যে আপনি লিখছেন এমন একটি রেজেক্সও পরীক্ষা ও পরিমার্জনে বেশ দরকারী বলে মনে হয়েছে।
জোয়

আমি এই প্রশ্নের আপনার উত্তরটির জন্য জিজ্ঞাসা করেছি: superuser.com/questions/149808/…
আয়ান বাল্ড

0

ধারণা হিসাবে তবে কিছু কাজ দরকার

dir -r | ? {$ _- ম্যাচ '[0-9] {13} \। (gif | jpg | png)'} | % {xcopy $ _। পুরো নাম সি: \ টেম্পি}

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