انسخ الملفات بكفاءة باستخدام PowerShell Copy-Item: دليل شامل

نسخ الملفات. ليس جذابًا ولكن يجب القيام به. في واجهة المستخدم الرسومية، نقوم بنسخ ولصق باستخدام الحافظة، ولكن في PowerShell لدينا أمر يسمى Copy-Item.

الأوامر لنسخ الملفات قد تكون موجودة منذ وقت طويل في جميع لغات الشيل. في عالم PowerShell ، الطريقة الأكثر شيوعًا للحصول على نسخة من ملف أو مجلد في سكريبت PowerShell الخاص بك من نقطة A إلى نقطة B هي باستخدام أمر PowerShell Copy-Item. يتيح لنا هذا الأمر نسخ ملف ومجلد مع إمكانية تكرار الملفات في مجلد ، واستخدام الرموز المميزة لتحديد الملفات التي نحتاج إلى نسخها ، وحتى استخدام بعد الطاقة في PowerShell لنسخ الملف!

هذاالأمر هو جزء من أوامر موفر PowerShell. إنه أمر عام يتم التعرف عليه بكلمة الاسم Item. يمكن استخدام معظم أوامر موفر الخدمة هذه عبر موفرين مختلفين ولكن في جميع سنوات استخدامي لـ PowerShell ، لم أر إلا Copy-Item يُستخدم مع موفر نظام الملفات.

من خلال استخدام هذا الأمر، يتيح PowerShell للمطور نسخ الملفات والمجلدات بعدة طرق مختلفة.

الاستخدام الأساسي

في أبسط حالاته، يقوم الأمر Copy-Item بنسخ ملف واحد من نقطة A إلى نقطة B باستخدام المعلمة Path كمسار للملف المصدر والمعلمة Destination كمسار للمجلد الوجهة.

PS> Test-Path -Path C:\PointB\1.txt
False
PS> Copy-Item -Path C:\PointA\1.txt -Destination C:\PointB\
PS> Test-Path -Path C:\PointB\1.txt
True 

هذا الأمر يمكن أيضًا نسخ المجلدات الفارغة أيضًا. سأقوم بسرد العناصر في المجلد C:\EmptyFolder ثم نسخها.

PS> Get-ChildItem -Path C:\EmptyFolder\
PS> Test-Path -Path C:\PointB\EmptyFolder -PathType Container
False
PS> Copy-Item -Path C:\EmptyFolder\ -Destination C:\PointB\
PS> Test-Path -Path C:\PointB\EmptyFolder -PathType Container
True 

ربما يكون هناك ملف غير قابل للكتابة في المجلد. بشكل افتراضي، لن يقوم Copy-Item بالكتابة فوقه. لفرض التجاوز، ما عليك سوى إضافة معامل Force.

تحديد النسخ باستخدام Copy-Item

بالإضافة إلى نسخ ملف أو مجلد واحد، يمكننا أيضًا نسخ محتويات المجلد بأكمله. يقبل معامل Path في Copy-Item أحرف البدل مثل النجمة لتطابق حرف واحد أو أكثر أو العلامة ؟ للتطابق فقط مع حرف واحد.

PS> @(Get-ChildItem -Path C:\PointB).Count
0
PS> @(Get-ChildItem -Path C:\PointA).Count
10000
PS> @(Get-ChildItem -Path C:\PointB).Count
0
PS> Copy-Item -Path C:\PointA\* -Destination C:\PointB\
PS> @(Get-ChildItem -Path C:\PointB).Count
10000
PS> @(Get-ChildItem -Path C:\PointB).Count
0
PS> Copy-Item -Path 'C:\PointA\26?0.txt' -Destination C:\PointB\
PS> Get-ChildItem -Path C:\PointB\

Directory: C:\PointB
Mode                LastWriteTime         Length Name
-a----        8/11/2017   8:59 AM              5 2600.txt
-a----        8/11/2017   8:59 AM              5 2610.txt
-a----        8/11/2017   8:59 AM              5 2620.txt
-a----        8/11/2017   8:59 AM              5 2630.txt
-a----        8/11/2017   8:59 AM              5 2640.txt
-a----        8/11/2017   8:59 AM              5 2650.txt
-a----        8/11/2017   8:59 AM              5 2660.txt
-a----        8/11/2017   8:59 AM              5 2670.txt
-a----        8/11/2017   8:59 AM              5 2680.txt
-a----        8/11/2017   8:59 AM              5 2690.txt

دمج عدة مجلدات معًا

ميزة رائعة أخرى في Copy-Item هي قدرته على نسخ عدة مجلدات معًا في نفس الوقت. من خلال تمرير مسارات متعددة إلى معامل Path، سينظر Copy-Item إلى كل منها، وسيقوم بنسخ إما المجلد أو الملفات اعتمادًا على المسار وسيقوم بدمجها جميعًا في الوجهة الواحدة.

PS> Copy-Item -Path C:\PointB\*,C:\PointC\*,C:\PointD\* -Destination C:\PointE
PS> Get-ChildItem -Path C:\PointE

Directory: C:\PointE
Mode                LastWriteTime         Length Name
-a----       11/11/2017  12:15 PM              2 PointBFile.txt
-a----       11/11/2017  12:15 PM              2 PointCFile.txt
-a----       11/11/2017  12:16 PM              4 PointDFile.txt

نسخ الملفات بشكل تكراري

من المحتمل أنك لن تحظى بالحظ وتجد كل الملفات في مجلد واحد بدون مجلدات فيه أيضًا. نعمة نجد عادة أنفسنا في حالات حيث لدينا الكثير من المجلدات الفرعية في المجلد الرئيسي والتي تحتوي على ملفات نرغب في نسخها. باستخدام معامل Recurse في Copy-Item، سيبحث بسرور في كل مجلد فرعي وينسخ جميع الملفات والمجلدات في كل منها بشكل تكراري.

لاحظ هنا أنني أقوم بتوجيه الملفات والمجلدات مباشرة من Get-ChildItem إلى Copy-Item. Copy-Item لديه دعم للأنابيب!

PS> (Get-ChildItem -Path C:\PointB\ -Recurse).Count
5
PS> Get-ChildItem -Path C:\PointB\ | Copy-Item -Destination C:\PointC -Recurse
PS> (Get-ChildItem -Path C:\PointC\ -Recurse).Count
5

مزايا استخدام معلمة PassThru

تحتوي العديد من الأوامر في PowerShell على معلمة PassThru. يمكن لأوامر تقديم النتائج فارغة عادةً أن تعيد الكائنات التي تتعامل معها باستخدام معلمة PassThru. هذه الأمر ليس استثناءً. عندما بدأت في البرمجة النصية لأول مرة، لم أستخدم هذه المعلمة لأنني لم أشعر أنني بحاجة إليها.

على سبيل المثال، إذا أردت نسخ ملف إلى موقع بعيد ثم الإشارة إلى ذلك الملف لاحقًا في النص البرمجي الخاص بي، فسأفعل شيئًا من هذا القبيل:

$remoteFilePath = '\WEBSRV1\c$\File.txt'
Copy-Item -Path C:\File.txt -Destination $remoteFilePath
Write-Host "I've just copied the file to $remoteFilePath"

هذه الطريقة تعمل ولكن يمكن أن تكون أفضل. بدلاً من تحديد متغير لمسار الوجهة البعيد، لماذا لا نقوم ببساطة بالتقاط الكائن الذي يتم إرجاعه من أمر `Copy-Item` عند استخدام معلمة `PassThru` بدلاً من ذلك؟ الكائنات المُرجعة ستحتوي دائمًا على مسار ملف الوجهة.

$copiedFile = Copy-Item -Path C:\File.txt -Destination '\WEBSRV1\c$'

نسخ الملفات باستخدام جلسة برمجة نصية عن بُعد

ميزة رائعة جاءت مع PowerShell v5 هي قدرة هذا الأمر على عدم استخدام بروتوكول SMB الافتراضي لنقل ملف ولكن بدلاً من ذلك استخدام WinRM وجلسة برمجة نصية عن بُعد. من خلال استخدام معلمة `Session`، يستخدم `Copy-Item` جلسة PowerShell موجودة مسبقًا وينقل الملفات بهذه الطريقة. هذه طريقة رائعة لتجاوز جدران الحماية وعندما يتم تشفير اتصال الجلسة، فإنها طبقة إضافية من الأمان أيضًا.

PS> $session = New-PSSession -ComputerName WEBSRV1
PS> Invoke-Command -Session $session -ScriptBlock { Test-Path -Path C:\File.txt }
False
PS> Copy-Item -Path C:\File.txt -ToSession $session -Destination 'C:\'
PS> Invoke-Command -Session $session -ScriptBlock { Test-Path -Path C:\File.txt }
True

كنا يمكن أن ننسخ ملف File.txt عبر SMB ونأمل في توافر المشاركة الإدارية C$ واستخدام مسار الوجهة `\\WEBSRV1\c$`. نظرًا لأننا استخدمنا معلمة `ToSession` بدلاً من ذلك، فإن مسار الوجهة سيكون دائمًا المسار المحلي للكمبيوتر الذي تعمل تحته الجلسة النصية عن بُعد.

الملخص

الأمر Copy-Item هو واحد من تلك الأوامر الأساسية في PowerShell التي ستستخدمها مرارًا وتكرارًا. في PowerShell، يمكنك نسخ الملفات والمجلدات بعدة طرق مختلفة باستخدام قدراته البسيطة ولكن القوية خاصة مع قدرته على استخدام الرموز المتجولة، ودمج عدة مجلدات من الملفات معًا، واستخدام جلسات الاتصال البعيد لـ PowerShell الموجودة بالفعل!

قراءة مزيد

Copy-item

Source:
https://adamtheautomator.com/copy-item/