PowerShell Out-File ile Dosyaya Çıkış Nasıl Yapılır
PowerShell komutlarının çıktısı varsayılan olarak terminalde görüntülenir. Ancak bazı durumlarda çıktıyı PowerShell'deki bir dosyaya yönlendirmek daha kullanışlıdır. Bunun için Out-File cmdlet’ini kullanacağız.
Bir PowerShell betiğinin veya komutunun sonuçlarını dosyaya çıkarmanın farklı yolları vardır. Çıktıyı terminalde gösterip aynı anda bir dosyaya aktarmak bile mümkündür. Ayrıca yalnızca başarı, uyarı veya hata sonuçlarını da dışa aktarabileceğinizi biliyor muydunuz?
Bu yazımızda PowerShell'de çıktının bir dosyaya nasıl yazılacağına bakacağız. Ayrıca mevcut bir dosyaya nasıl ekleme yapabileceğinizi veya nasıl bir günlük dosyası oluşturabileceğinizi de anlatacağım.
Powershell Dosyaya Çıktı Yazma
PowerShell çıktısını bir dosyaya yazmanın birkaç yolu vardır. En yaygın yöntemler Out-File cmdlet'ini veya > yönlendirme operatörünü kullanmaktır. Diğer seçenekler Set-Content ve Add-Content cmdlet'ini kullanmaktır. Biz ilk ikisine odaklanacağız ama yeri gelirse alternatiften de kısaca bahsedeceğim.
Out-File cmdlet'i ve yönlendirme operatörü >, PowerShell çıkışını bir dosyaya yazmanıza ve eklemenize (>>) olanak tanır. İkisi arasındaki fark, ilkinin parametreleri kabul etmesi, ikincisinin kabul etmemesidir.
Out-File cmdlet'i ile aşağıdaki parametreleri kullanabiliriz:
- -Filepath
Dosyanın konumunu ve adını ayarlayın
- -Append
Çıktıyı dosyanın mevcut içeriğine ekleyin
- -Force
Salt okunur bir dosyanın üzerine yaz
- -NoClobber
Dosyanın üzerine yazılmasını önle
- -NoNewLine
Yeni satır karakteri yazılmayacaktır.
- -Width
Her satırdaki karakter sayısını sınırlayın (varsayılan 80)
- -WhatIf
Test modunda çalıştır
PowerShell Yönlendirme Operatörü
Ancak yönlendirme operatörünün herhangi bir parametresi yoktur. Ancak Out-File'a göre bir avantajı var. Out-File cmdlet'i kullanıldığında yalnızca başarılı sonuçlar dışa aktarılır, böylece uyarılar veya hatalar dosyaya yazılmaz.
Yönlendirme operatörünü kullanırken hangi akışı dışa aktarmak istediğimizi belirtebiliriz:
| Operator | Description / Stream | Write cmdlet |
|---|---|---|
| > | Success only | Write-Output |
| 2> | Error only | Write-Error |
| 3> | Warning only | Write-Warning |
| 4> | Verbose only | Write-Verbose |
| 5> | Debug only | Write-Debug |
| 6> | Information only | Write-Information |
| *> | All |
Farklı akışlar hakkında daha sonra daha fazla bilgi vereceğim, ancak önce PowerShell'de çıktıyı bir dosyaya nasıl kolayca yazabileceğimize bir göz atalım.
Çıktıyı bir dosyaya yazmak için tek yapmanız gereken Out-File cmdlet'ini betiğinizin veya komutunuzun arkasına yönlendirmek ve yolu belirtmektir. Dosya mevcut değilse cmdlet tarafından oluşturulacaktır:
Get-Process -Name explorer | Out-File -FilePath c:\temp\process.txt
# Same as:
Get-Process -Name explorer > c:\temp\process.txt
# The results
Get-Content C:\temp\process.txt
NPM(K) PM(M) WS(M) CPU(s) Id SI ProcessName
------ ----- ----- ------ -- -- -----------
132 94,56 158,22 131,45 123364 1 explorer
PS C:\>Gördüğünüz gibi Get-Process cmdlet'inin sonuçları proses.txt dosyasında saklanıyor:
Başka bir parametre belirtmezseniz Out-File cmdlet'i ve yönlendirme operatörü varsayılan olarak mevcut herhangi bir dosyanın üzerine yazacaktır. Cmdlet'e -NoClobber parametresini ekleyerek bunu önleyebiliriz.
Get-Process -Name explorer | Out-File c:\temp\process.txt -NoClobberYönlendirme operatörüyle üzerine yazmayı engelleyemeyeceğinizi unutmayın
Dosya zaten mevcutsa bir hata atılır:
Bir betik içindeki bir dosyaya çıktı vermek istiyorsanız, dosyanın zaten var olup olmadığını belirlemek için önce Test-Path cmdlet'ini kullanmanızı öneririm. Bu şekilde, dosyaya yazmaya çalışmak yerine dosya adına tarih eklemek gibi daha iyi bir çözüm yazabilirsiniz:
$exportPath = "C:\temp\process.txt"
If (Test-Path $exportPath) {
# Show a warning or change the file name here
Write-Warning "File already exists"
$exportPath = "C:\temp\process-1.txt" # create something nice with a date or timestamp
}else{
Get-Process -Name explorer | Out-File $exportPath -NoClobber
}PowerShell Dosyaya Ekle
Üzerine yazmak yerine çıktıyı dosyanın mevcut içeriğine de ekleyebiliriz. Bunun için ya -append parametresini kullanabiliriz ya da yönlendirme operatörünü >> kullanabiliriz. Her iki durumda da çıktının içeriği mevcut dosyaya eklenecektir.
Ayrıca mevcut olmayan bir dosyaya da ekleyebilirsiniz; belirtilen dosya yoksa her iki yöntem de yeni bir dosya oluşturacaktır.
# Append with the Out-File cmdlet
'Apple' | Out-File -FilePath C:\temp\fruits.txt -Append
Get-Content -Path c:\temp\fruits.txt
# Result
Apple
# Append with the redirect operator
'Pear' >> C:\temp\fruits.txt
Get-Content -Path c:\temp\fruits.txt
# Result
Apple
PearÇıktıyı mevcut bir dosyaya eklerken içerik yeni bir satıra yerleştirilecektir. İçeriğin tek bir satırda olmasını ve uzun bir dize oluşturmasını istiyorsanız -NoNewLine parametresiyle Out-File cmdlet'ini kullanmanız gerekecektir.
Yeni satır karakteri, dosyaya eklediğiniz değerden sonra yerleştirilir. Bu nedenle -NoNewLine parametresini ilk Çıktıya eklemek de önemlidir.
# Note that you will need to specify NoNewLine for the first entry as well
'BlueBerry;' | Out-File -FilePath C:\temp\fruits.txt -NoNewline
# Appending more berries
'StrawBerry;' | Out-File -FilePath C:\temp\fruits.txt -Append -NoNewline
'BlackBerry;' | Out-File -FilePath C:\temp\fruits.txt -Append -NoNewline
'RaspBerry;' | Out-File -FilePath C:\temp\fruits.txt -Append -NoNewline
'CranBerry;' | Out-File -FilePath C:\temp\fruits.txt -Append -NoNewlineSonucun daha okunaklı olması için tüm değerlere noktalı virgül ekledim. Gördüğünüz gibi tüm sonuçlar aynı satırda:
PowerShell Add-Content'i Kullanma
Bir dosyaya içerik eklemenin başka bir seçeneği de İçerik Ekle cmdlet'ini kullanmaktır. İçerik Ekle cmdlet'inin en büyük avantajlarından biri, aynı anda birden fazla dosyaya içerik eklemenize izin vermesidir.
Out-File cmdlet'i ve yönlendirme operatöründe olduğu gibi, İçerik Ekle cmdlet'i, dosya mevcut değilse yeni bir dosya oluşturur
Yani bir dosyaya basitçe içerik eklemek için aşağıdaki komutu kullanabiliriz:
Add-Content -Path c:\temp\file.txt -Value "New line to add"Aynı içeriği birden fazla dosyaya eklemek için bize yardımcı olacak birkaç parametremiz var. Güncellemek istediğimiz dosyaları belirtmek için yolda joker karakterler kullanabiliriz. Ayrıca dosya adlarını hariç tutabilir ve hatta bir filtre kullanabiliriz.
Aşağıdaki örnek, dosya adında benioku yazan dosya hariç, c:\temp\files yolundaki tüm TXT dosyalarına geçerli tarihi ekleyecektir:
Add-Content -Path C:\temp\files\*.txt -Value (Get-Date) -Exclude "readme*"Benioku dosyaları dışındaki tüm dosyalar güncellenir:
Hem dahil etme hem de hariç tutma parametreleri, güncellemek istediğiniz veya istemediğiniz dosyaların dize dizisini belirtmenize olanak tanır.
Yukarıdaki örneği ele alırsak, yalnızca log kelimesini içeren dosyaları seçmek için filter parametresini de kullanabiliriz:
Add-Content -Path C:\temp\files\* -Value (Get-Date) -Filter "*log*"Dosyaya yalnızca Hataları, Uyarıları veya Başarıyı yazın
Dosya dışı cmdlet'i yalnızca komutunuzun veya komut dosyanızın başarılı sonucunu bir dosyaya yazacaktır. Ancak bazen uyarıların veya hataların da çıktı olarak verilmesini istersiniz.
Bunu başarmak için yönlendirme operatörünü kullanabiliriz. Bir dosyaya hangi akışın çıktısını almak istediğinizi belirtmenize olanak tanır.
Örnek olarak aşağıdaki betiği ele alalım:
Function Get-ProcessCpu {
param(
[Parameter(Mandatory = $true)]$name
)
Get-Process -Name $name | select cpu
}
Get-ProcessCpu -name "explorer2" | Out-File C:\temp\process.txt"Explorer2" işlemi mevcut olmadığından Get-Process cmdlet'i bir hata verecektir. Eğer scripti bu şekilde çalıştırırsak proses.txt dosyası tamamen boş olacaktır.
Ancak yönlendirme operatörünü kullanırsak hangi akışın çıktısını almak istediğimizi belirtebiliriz.
# Write all results to the file:
Get-ProcessCpu -name "explorer2" *> C:\temp\process.txt
# Write only the error to the file:
Get-ProcessCpu -name "explorer2" 2> C:\temp\process-error-log.txt
# Write only warnings to a file:
Get-ProcessCpu -name "explorer2" 3> C:\temp\process-error-log.txtGördüğünüz gibi hata, yönlendirme operatörüyle metin dosyasına yazılıyor:
Powershell Günlük Dosyasına Yaz
Bir günlük dosyasına yazmanın en iyi seçeneği Start-Transcript cmdlet'ini kullanmaktır ancak Add-Content cmdlet'ini veya yönlendirme operatörünü kullanarak da kendi günlük işlevimizi yazabiliriz.
Yönlendirme operatörünü kullanmak olasılıklarınızı sınırlayacaktır, ancak yalnızca bir komut dosyasının hatalarını bir günlük dosyasına yazmak istiyorsanız harika bir yoldur:
Function Get-ProcessCpu {
param(
[Parameter(Mandatory = $true)]$name
)
Get-Process -Name $name | select cpu
}
# Write only errors to a log file
Get-ProcessCpu -name "explorer2" 2>> "C:\temp\files\$env:computername-process.log"Ancak bir günlük dosyasına mesaj yazarken muhtemelen biraz daha fazla kontrole sahip olmak istersiniz. Günlük dosyalarıyla olayın ne zaman gerçekleştiğini ve olayın ciddiyetini görebilmemiz önemlidir. Yani yapmak istediğimiz şey, günlük mesajına bir zaman damgası ve olay düzeyi eklemek.
Bu şekilde günlük dosyasını kolayca okuyabilir ve meydana gelen hataları tespit edebiliriz.
# Set log file path
$logFile = "C:\temp\files\$env:computername-process.log"
Function Write-Log {
param(
[Parameter(Mandatory = $true)][string] $message,
[Parameter(Mandatory = $false)]
[ValidateSet("INFO","WARN","ERROR")]
[string] $level = "INFO"
)
# Create timestamp
$timestamp = (Get-Date).toString("yyyy/MM/dd HH:mm:ss")
# Append content to log file
Add-Content -Path $logFile -Value "$timestamp [$level] - $message"
}
Write-Log -level ERROR -message "String failed to be a string"Yukarıdaki işlev, PowerShell için önem derecesi ve zaman damgasıyla birlikte mesajları (olayları) bir günlük dosyasına yazmanıza olanak tanıyan basit bir günlük dosyası oluşturucusunun bir örneğidir.
Kapanış
Gördüğünüz gibi PowerShell'de sonuçları bir dosyaya çıkarmanın birden fazla yolu vardır. Bir şeyin hızlı bir şekilde dosyaya çıktısını almak için yönlendirme operatörünü veya Out-File cmdlet'ini kullanabilirsiniz.
Çıktıyı bir CSV dosyasına aktarmak istediğinizde bu makaleyi okuduğunuzdan emin olun. Değiştir yöntemini kullanarak bir dosyanın içindeki içeriği değiştirmek de mümkündür.
Herhangi bir sorunuz varsa aşağıya bir yorum bırakmanız yeterli.





