Dosya ve klasörlerle çalışma

PowerShell sürücülerinde gezinmek ve bu sürücülerdeki öğeleri düzenlemek, Windows disk sürücülerindeki dosya ve klasörleri düzenlemeye benzer. Bu makalede, PowerShell kullanarak belirli dosya ve klasör işleme görevleriyle nasıl başa çıkılacağı açıklanır.

Klasör içindeki tüm dosya ve klasörleri listeleme

kullanarak Get-ChildItemtüm öğeleri doğrudan bir klasör içinde alabilirsiniz. Gizli öğeleri veya sistem öğelerini görüntülemek için isteğe bağlı Force parametresini ekleyin. Örneğin, bu komut PowerShell Sürücüsünün C:doğrudan içeriğini görüntüler.

Get-ChildItem -Path C:\ -Force

Komutu yalnızca doğrudan kapsanan öğeleri listeler; örneğin unix kabuğunda cmd.exe veya ls içinde komutunu kullanabilirsinizdir. Alt klasördeki öğeleri göstermek için Özyinele parametresini belirtmeniz gerekir. Aşağıdaki komut sürücüdeki C: her şeyi listeler:

Get-ChildItem -Path C:\ -Force -Recurse

Get-ChildItemöğeleri Path, Filter, Include ve Exclude parametreleriyle filtreleyebilir, ancak bunlar genellikle yalnızca adı temel alır. kullanarak Where-Objectöğelerin diğer özelliklerine göre karmaşık filtreleme gerçekleştirebilirsiniz.

Aşağıdaki komut, Program Files klasöründe en son 1 Ekim 2005'ten sonra değiştirilen ve ne 1 megabayttan küçük ne de 10 megabayttan büyük olan tüm yürütülebilir dosyaları bulur:

Get-ChildItem -Path $env:ProgramFiles -Recurse -Include *.exe |
    Where-Object -FilterScript {
        ($_.LastWriteTime -gt '2005-10-01') -and ($_.Length -ge 1mb) -and ($_.Length -le 10mb)
    }

Dosya ve klasörleri kopyalama

Kopyalama işlemi ile Copy-Itemyapılır. Aşağıdaki komut PowerShell profil betiğinizi yedekler:

if (Test-Path -Path $PROFILE) {
    Copy-Item -Path $PROFILE -Destination $($PROFILE -replace 'ps1$', 'bak')
}

Komut, Test-Path profil betiğinin mevcut olup olmadığını denetler.

Hedef dosya zaten varsa kopyalama girişimi başarısız olur. Önceden var olan bir hedefin üzerine yazmak için Force parametresini kullanın:

if (Test-Path -Path $PROFILE) {
    Copy-Item -Path $PROFILE -Destination $($PROFILE -replace 'ps1$', 'bak') -Force
}

Bu komut, hedef salt okunur olduğunda bile çalışır.

Klasör kopyalama aynı şekilde çalışır. Bu komut klasörü C:\temp\test1 yinelemeli olarak yeni klasöre C:\temp\DeleteMe kopyalar:

Copy-Item C:\temp\test1 -Recurse C:\temp\DeleteMe

Ayrıca, bir öğe seçimini de kopyalayabilirsiniz. Aşağıdaki komut, içinde C:\data herhangi bir yerde bulunan tüm .txt dosyaları klasörüne C:\temp\textkopyalar:

Copy-Item -Filter *.txt -Path c:\data -Recurse -Destination C:\temp\text

Dosyaları kopyalamak için ve robocopy.exe gibi xcopy.exe yerel komutları çalıştırmaya devam edebilirsiniz.

Dosya ve klasör oluşturma

Yeni öğeler oluşturmak tüm PowerShell sağlayıcılarında aynı şekilde çalışır. Bir PowerShell sağlayıcısında birden fazla öğe türü varsa (örneğin, FileSystem PowerShell sağlayıcısı dizinler ve dosyalar arasında ayrım gerçekleştirir), öğe türünü belirtmeniz gerekir.

Bu komut yeni bir klasör C:\temp\New Folderoluşturur:

New-Item -Path 'C:\temp\New Folder' -ItemType Directory

Bu komut yeni bir boş dosya oluşturur C:\temp\New Folder\file.txt

New-Item -Path 'C:\temp\New Folder\file.txt' -ItemType File

Önemli

Bir klasör oluşturmak için komutuyla Zorla anahtarını kullanırken ve klasör zaten var olduğunda, klasörün üzerine yazılmıyor veya klasör değiştirilmiyor.New-Item Yalnızca mevcut klasör nesnesini döndürür. Ancak, zaten var olan bir dosyada kullanıyorsanız New-Item -Force , dosyanın üzerine yazılır.

Klasör içindeki tüm dosya ve klasörleri kaldırma

kullanarak Remove-Itemkapsanan öğeleri kaldırabilirsiniz, ancak öğe başka bir şey içeriyorsa kaldırma işlemini onaylamanız istenir. Örneğin, diğer öğeleri içeren klasörü C:\temp\DeleteMe silmeye çalışırsanız, PowerShell klasörü silmeden önce sizden onay ister:

Remove-Item -Path C:\temp\DeleteMe
Confirm
The item at C:\temp\DeleteMe has children and the Recurse parameter wasn't
specified. If you continue, all children will be removed with the item. Are you
sure you want to continue?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help
(default is "Y"):

Kapsanan her öğe için sorulmasını istemiyorsanız Recurse parametresini belirtin:

Remove-Item -Path C:\temp\DeleteMe -Recurse

Yerel klasörü sürücü olarak eşleme

Komutunu kullanarak New-PSDrive yerel klasörü de eşleyebilirsiniz. Aşağıdaki komut, yalnızca PowerShell oturumundan görülebilen, yerel Program Files dizininde kök dizinine sahip bir yerel sürücü P: oluşturur:

New-PSDrive -Name P -Root $env:ProgramFiles -PSProvider FileSystem

Ağ sürücülerde olduğu gibi, PowerShell içinde eşlenen sürücüler de PowerShell kabuğuna hemen görünür. Dosya Gezgini görünür eşlenmiş bir sürücü oluşturmak için Persist parametresini kullanın. Ancak, Kalıcı ile yalnızca uzak yollar kullanılabilir.

Metin dosyasını diziye okuma

Metin verileri için en yaygın depolama biçimlerinden biri, ayrı satırlar ayrı veri öğeleri olarak ele alınan bir dosyadadır. Get-Content Cmdlet, burada gösterildiği gibi bir adımda dosyanın tamamını okumak için kullanılabilir:

Get-Content -Path $PROFILE
# Load modules and change to the PowerShell-Docs repository folder
Import-Module posh-git
Set-Location C:\Git\PowerShell-Docs

Get-Content dosyadan okunan verileri, dosya içeriği satırı başına bir öğeyle bir dizi olarak ele alır. Döndürülen içeriğin Uzunluğunu denetleyerek bunu onaylayabilirsiniz:

PS> (Get-Content -Path $PROFILE).Length
3

Bu komut, en çok bilgi listelerini PowerShell'e almak için kullanışlıdır. Örneğin, dosyada bilgisayar adlarının veya IP adreslerinin listesini, dosyanın C:\temp\domainMembers.txther satırında bir adla depolayabilirsiniz. Dosya içeriğini almak ve değişkenine $Computersyerleştirmek için kullanabilirsinizGet-Content:

$Computers = Get-Content -Path C:\temp\DomainMembers.txt

$Computers artık her öğede bir bilgisayar adı içeren bir dizidir.