PowerShell یک موتور هوشمند و خودکار برای کاربران ویندوز است که به مدیریت بهتر شبکه های کامپیوتری کمک می کند. در واقع مایکروسافت PowerShell را به عنوان ابزاری قدرتمند برای عیب یابی و خودکارسازی فرآیندهای سیستم عامل ویندوز معرفی کرده است. این ابزار از ویندوز دارای دستورات و برنامه هایی است که هر کاربر قبل از شروع باید از آنها آگاه باشد. در این مقاله قصد داریم با یک مثال دستورات PowerShell Copy Item را بررسی کنیم. پس با ما همراه باشید.
به طور کلی می توانید از دستور Copy-Item برای کپی کردن یک آیتم از مکانی به مکان دیگر استفاده کنید. این دستور فقط آیتم را کپی می کند و سپس آن را قطع یا حذف نمی کند. Copy-Item همچنین می تواند مورد را کپی و تغییر نام دهد و فقط باید نام جدید را در پارامتر Destination در فرمان PowerShell copy-item وارد کنید. طبق MSDN، دستور copy-item به شرح زیر است:
Copy-Item
[-Path] <String[]>
[[-Destination] <String>]
[-Container]
[-Force]
[-Filter <String>]
[-Include <String[]>]
[-Exclude <String[]>]
[-Recurse]
[-PassThru]
[-Credential <PSCredential>]
[-WhatIf]
[-Confirm]
[-FromSession <PSSession>]
[-ToSession <PSSession>]
[<CommonParameters>]
این مقاله از Windows PowerShell ISE برای نوشتن، اجرا و اشکال زدایی اسکریپت های PowerShell استفاده می کند. در ادامه با نمونه های بیشتری از کپی های PowerShell همراه باشید.
در این مثال نحوه کپی کردن فایل از مکانی به مکان دیگر با استفاده از دستور Copy-Item انجام شده و مشاهده می شود که فایل در محل مقصد کپی شده است.
Copy-Item “D:\Source\Test.docx” -Destination “D:\Bijay\Destination”
در این مثال نحوه کپی کردن تمامی فایل ها از یک مکان به مکان دیگر مورد بررسی قرار می گیرد و در واقع چندین نوع فایل مختلف در پوشه Source با استفاده از cmdlet در PowerShell Copy-Item از پوشه مبدا به پوشه مقصد کپی می شوند.
Copy-Item “D:\Source\*” -Destination “D:\Bijay\Destination”
برای کپی کردن زیرپوشه های بازیابی آیتم ها در PowerShell می توان از دستور زیر استفاده کرد. در این حالت در پوشه Source یک زیر پوشه وجود دارد که دارای چندین فایل است و با اجرای دستور زیر فقط پوشه را ایجاد می کند و فایل های ارائه شده در زیر پوشه را کپی نمی کند.
Copy-Item “D:\Source\*” -Destination “D:\Bijay\Destination”
در حقیقت، اگر پوشه فرعی دارای زیر پوشه تو در تو باشد، هنگام اجرای cmdlet در Copy-Item PowerShell، زیر پوشه تو در تو ایجاد نمیشود.
برای کپی کردن آیتمها به صورت بازگشتی، باید از پارامتر -Recurse با cmdlet Copy-Item PowerShell استفاده کرد.
Copy-Item “D:\Source\*” -Destination “D:\Bijay\Destination” -Recurse
پس از اجرای دستور بالا، می توان مشاهده کرد که پوشه فرعی شامل پوشه های فرعی تو در تو و پرونده ها را در پوشه مقصد ایجاد می کند.
با استفاده از دستور زیر میتوان آیتمها را از پوشه منبع کپی و در یک پوشه جدید (NewFolder جدید) در مقصد ذخیره کرد. در اینجا میبایست در پارامتر Destination ، باید نام پوشهای مانند زیر را ارائه کرد.
Copy-Item “D:\Source” -Destination “D:\Bijay\Destination\NewFolder” –Recurse
به منظور کپی آیتمها و فایلها، بدون پوشه میتوان از اسکریپت زیر استفاده نمود. باید اشاره کرد که دستور زیر موارد یا پروندهها را فقط از پوشه اصلی کپی مینماید و فایلها را از پوشههای فرعی کپی نمیکند.
Get-ChildItem D:\Source\ -File | Copy-Item -Destination D:\Bijay\Destination
در صورتی که قصد کپی کردن فایلها به صورت بازگشتی از زیرفولدرها باشد، باید از پارامتر -Recurse مانند زیر استفاده کرد.
Get-ChildItem D:\Source\ -File -Recurse | Copy-Item -Destination D:\Bijay\Destination
برای کپی کردن فایلهای خاص (به عنوان مثال فایلهایی با فرمت PDF) میتوان از نمونه اسکریپت زیر استفاده کرد.
Copy-Item -Path D:\Source\* -Destination D:\Bijay\Destination -Filter ‘*.pdf’
هنگامی که از دستور PowerShell copy-item cmdlets برای کپی کردن آیتمها استفاده میشود، به وسیله اسکریپت زیر میتوان برخی از فایلها و بخشها را حذف کرد و مانع از انتقال شد.
Copy-Item “D:\Source\*” -Destination “D:\Bijay\Destination\” -Recurse -Exclude TestPDF.pdf,Test.docx
با استفاده از اسکریپت PowerShell فوق فایل TestPDF.pdf و Test.docx از فهرست حذف و Copy-Item نیز پروندهها را از زیر پوشهها و زیر پوشهای تو در تو حذف میکند. علاوه بر این اسکریپت مربوطه را میتوان مانند موارد زیر وارد کرد.
Copy-Item “D:\Source\*” -Destination “D:\Bijay\Destination\” -Recurse -Exclude @(“TestPDF.pdf”,”Test.docx”)
$exclusionFiles = @(“TestPDF.pdf”,”Test.docx”)
Copy-Item “D:\Source\*” -Destination “D:\Bijay\Destination\” -Recurse -Exclude $exclusionFiles
با استفاده از اسکریپت زیر میتوان در هنگام کپی کردن آیتمها و فولدرها، برخی از فولدرها را در صورت خواست خارج و حذف کرد.
Copy-Item -Path (Get-Item -Path “D:\Source\*” -Exclude (‘Subfolder’)).FullName -Destination “D:\Bijay\Destination\” -Recurse –Force
به این ترتیب هنگام کپی کردن، پوشه فرعی از Source حذف میشود. اما اگر بخواهیم چندین پوشه را حذف کنیم، (مثلاً میخواهیم نام پوشهها را به عنوان Folder1 ،Folder2 حذف کنیم) ،باید از اسکریپت زیر استفاده شود.
Copy-Item -Path (Get-Item -Path “D:\Source\*” -Exclude (‘Folder1’, ‘Folder2’)).FullName -Destination “D:\Bijay\Destination\” -Recurse –Force
در این دستور نیز میتوان در هنگام کپی کردن، فایلها و فولدرها را به همراه هم در میان آنها خارج و حذف کرد.
Copy-Item -Path (Get-Item -Path “D:\Source\*” -Exclude (‘Folder1’, ‘Test.docx’)).FullName -Destination “D:\Bijay\Destination\” -Recurse –Force
برای حذف کردن یا به قولی مستثنی کردن انواعی از فایلها در کپی کردن میتوان از اسکریپت زیر استفاده نمود. در مثال زیر اسکریپت به شکلی نوشته شده است که امکان کپی کردن فایلهای PDF وجود نداشته باشد.
$exclusionFiles = @(“*.pdf”)
Copy-Item “D:\Source\*” -Destination “D:\Bijay\Destination\” -Recurse -Exclude $exclusionFiles
در اینجا فایل های pdf از زیر پوشه ها و زیر پوشه های تو در تو هنگام کپی فایل ها حذف می شوند.
همچنین اگر بخواهیم بیش از یک نوع فایل را حذف کنیم، می توان از اسکریپت زیر استفاده کرد. برای مثال در اینجا فایل هایی با پسوند pdf و txt حذف شده اند.
$exclusionFiles = @(“*.pdf”,”*.txt”)
Copy-Item “D:\Source\*” -Destination “D:\Bijay\Destination\” -Recurse -Exclude $exclusionFiles
در این اسکریپت در هنگام کپی کردن پوشه خالی به مقصد انتقال نمییابد. به این ترتیب این اسکریپت همه پوشهها و فولدرها ارزیابی میکند و مانع از انتقال نمونههای خالی میشود.
$Source = “D:\Source\”
$items = Get-ChildItem $Source -Force
$Destination=”D:\Bijay\Destination\”
ForEach ($item in $items)
{
if((Get-ChildItem -Path $($item.FullName)).Count -gt 0)
{
Copy-Item -Path $item.FullName -Destination $Destination -Force -Recurse
}
}
در بسیاری از موارد که نمی خواهیم فایل های مخفی یا به اصطلاح مخفی را کپی کنیم، می توان از اسکریپت زیر استفاده کرد. به این ترتیب پوشه های مخفی کپی نمی شوند.
ForEach ($FileItem in (gci -Path ‘D:\Source’ -Recurse))
{ Copy-Item $FileItem.FullName -Destination ‘D:\Bijay\Destination’ }
این دستور فرآیند کپی را بررسی می کند و اگر فایل یا پوشه ای در مقصد باشد، آن فایل یا پوشه را کپی نمی کند و فقط در صورتی که در مقصد نباشد. برای اجرای این دستور می توان از اسکریپت زیر استفاده کرد.
$sourceFile = ‘D:\Source\Test.docx’
$destinationFile = ‘D:\Bijay\Destination\Test.docx’
if (-not (test-path $destinationFile))
{
Copy-Item $sourceFile -Destination $destinationFile
}
اسکریپت PowerShell هر فایل را در پوشه زیر بررسی میکند و در صورت وجود آن در پوشه مقصد، آن را کپی نمیکند. در غیر این صورت فایل در پوشه مقصد کپی می شود. فایل ها نیز برای پوشه ها و زیر پوشه ها بررسی می شوند.
$Source = “D:\Source\”
$items = Get-ChildItem $Source -Force
$Destination=”D:\Bijay\Destination\”
ForEach ($item in $items)
{
$destinationFile = $Destination+$item.FullName
if (-not (test-path $destinationFile))
{
Copy-Item -Path $item.FullName -Destination $Destination -Force -Recurse
}
}
به طور پیش فرض، وقتی با استفاده از دستور زیر آیتمی کپی شود، آن مورد در مقصد انتقال مییابد.
Copy-Item “D:\Source\*” -Destination “D:\Bijay\Destination” -Recurse
این اسکریپت برای فایلها کاملا درست به کار میرود، اما برای فولدرها خطا ایجاد میکند.
میتوان با افزودن پارامتر Confirm: $ true مانند زیر یک پیام تأیید اضافه کرد و به این ترتیب وقتی اسکریپت PowerShell زیر اجرا میگردد، سیستم درخواست تایید میکند.
Copy-Item “D:\Source\*” -Destination “D:\Bijay\Destination” -Recurse -Confirm:$true -Force
اسکریپت زیر را می توان برای رفع خطای بالا در فرمان PowerShell copy-item overwrite directory استفاده کرد.
Copy-Item “D:\Source\*” -Destination “D:\Bijay\Destination” -Recurse -Force
اگر از دستور PowerShell copy-item استفاده شده باشد و بخواهیم نوار پیشرفت یا نوار پیشرفت ایجاد کنیم، از اسکریپت زیر استفاده می شود.
Function Copy-WithProgress
{
[CmdletBinding()]
Param
(
[Parameter(Mandatory=$true,
ValueFromPipelineByPropertyName=$true,
Position=0)]
$Source,
[Parameter(Mandatory=$true,
ValueFromPipelineByPropertyName=$true,
Position=0)]
$Destination
)
$Source=$Source.tolower()
$Filelist=Get-Childitem “$Source” –Recurse
$Total=$Filelist.count
$Position=0
foreach ($File in $Filelist)
{
$Filename=$File.Fullname.tolower().replace($Source,”)
$DestinationFile=($Destination+$Filename)
Write-Progress -Activity “Copying data from ‘$source’ to ‘$Destination'” -Status “Copying File $Filename” -PercentComplete (($Position/$total)*100)
Copy-Item $File.FullName -Destination $DestinationFile
$Position++
}
}
$src=”D:\Data\Songs”
$dest=”D:\Bijay\Destination”
Copy-WithProgress -Source $src -Destination $dest
به این ترتیب progress bar یا نوار پیشرفت به شکل زیر به وجود میآید.
با استفاده از اسکریپت زیر ، اجازه کپی آیتم از شبکه داده میشود.
$Session = New-PSSession -ComputerName “Server01” -Credential “Domain\username”
Copy-Item “D:\SourceFolder\” -Destination “C:\DestinationFolder\” -ToSession $Session
همچین اگر بخواهیم به صورت بازگشتی کپی کنیم باید پارامتر -Recurse اضافه گردد.
$Session = New-PSSession -ComputerName “Server01” -Credential “Domain\username”
Copy-Item “D:\SourceFolder\” -Destination “C:\DestinationFolder\” -ToSession $Session -Recurse
حال با کاربرد اسکریپت زیر میتوان چندین پوشه را هنگام استفاده از cmdletهای PowerShell Copy-Item ادغام کرد.
Copy-Item -Path D:\Source\*,D:\Source1\*,D:\Source2\* -Destination D:\Bijay\Destination\
اسکریپت PowerShell فوق همه پروندهها را از پوشه های Source ، Source1 و Source2 در پوشه Destination کپی می کند.
هنگام کپی کردن یک فایل با استفاده از Copy-Item، می توانید نام آن را نیز تغییر دهید، و این کار با اسکریپت PowerShell زیر انجام می شود.
Copy-Item -Path D:\Source\Test.docx -Destination D:\Bijay\Destination\NewTest.docx
در اینجا فایل Test.docx در پوشه Destination با نام جدید کپی میشود و نام فایل NewTest.docx خواهد بود.