Klasik
Komut Satırında ve Powershell’de Dosyaların
Uygulamalar Tarafından Açılması
Klasik komut satırında, C: sürücüsünde Dosyalar adında
bir klasörün içindeyim. Buradaki dosyaların listesini görmek için “dir” komutunu veriyorum:
Klasörde tek bir dosya var, adı list.txt. “txt” uzantısı bu dosyanın bir metin dosyası olduğunu
gösteriyor.
Metin dosyalarını genelde Notepad uygulaması ile açıp
inceleriz.
Notepad ile nasıl bir komut vermeliyim?
Burada biraz duralım, klasik komut satırının mantığını
anımsayalım.
Klasik
komut satırında komutların genel yazımı şu şekilde oluyor:
Komut
Nesne Hedef Parametreler
Bir
örnekle durumu açıklayalım:
Yapmak
istediğimiz iş K: sürücüsünde bulunan dosyaların tümünü C: sürücüsündeki
MUHASEBE klasörüne kopyalamak.
Komutumuz
COPY komutu olacak. Nesnemiz K: sürücüsündeki tüm dosyalar, hedefimiz ise
C:\sürücüsündeki MUHASEBE klasörü.
Verilecek
komut da şöyle oluyor:
COPY K:*.* C:\MUHASEBE
Komut Nesne Hedef
Yukarıda
açıkladığımız komut, nesne ve hedef şeklindeki ayırıma dikkat ederseniz,
bilgisayara komut satırından bir şey yaptırmanın birden kolaylaştığını fark
edeceksiniz.
Komut,
nesne ve hedef terimleri arasında en az bir boşluk bırakın. İşletim sistemi bu
boşluklar yardımı ile komutu, nesneyi ve hedefi ayırt eder.
Bu nottan sonra başlangıçtaki işimize dönelim. Eğer
list.txt dosyasını Notepad ile açmak istersem vermem gereken komut şöyle
olacak:
Komut Nesne
Notepad list.txt
Komutu bu şekilde verdiğimizde gerçekten notepad’in başlatıldığını ve nesne olarak verdiğimiz
list.txt dosyasının Notepad ile açıldığını görebiliriz:
Komutları çalıştırmanın, dosyaları açmanın normal yolu
bu.
Ama bu işi yapmanın bir başka yolu daha var.
O da komut satırında yalnızca list.txt yazıp Enter’a basmak.
Bunu yaptığımızda da Notepad uygulaması başlatılır,
list.txt dosyası açılır.
İyi ama bu nasıl olur?
Komut satırında önce bir komut yazmalıydık, “copy” gibi, “Notepad” gibi. Komut yazmadan yalnızca bir
dosya adı yazdık.
Bunu yaptığımızda, komut satırı “böyle bir komut yok”
anlamında bir hata mesajı döndürmeliydi.
Neden hata mesajı dönmedi de dosya başarılı bir
şekilde açıldı?
Eğer son işlemi DOS ve Windows’un ilk zamanlarında
yapıyor olsaydık tam da beklediğimiz gibi bir hata mesajı alırdık.
Komut satırı katı kurallara sahipti: Önce geçerli bir
komut adı yazmak şarttı.
Zaman içinde komut satırındaki katılıklar atıldı,
komut satırı aslında yanlış denilecek ifadeleri kabul edip bunları başarıyla
işlemeye başladı.
Peki, komut satırı bunu nasıl yaptı? List.txt şeklinde
bir ifade yazıp Enter’a basınca Word’ün değil de notepad’in çalıştırılacağını nereden biliyordu?
Bu sorunun yanıtı da dosya uzantıları ile
uygulamaların eşleştirilmesinde yatıyor. Txt dosyaları Notepad uygulaması ile
eşleştiriliyor.
Eğer txt uzantılı bir dosya adı bir komut şeklinde
veriliyorsa, işletim sistemi elindeki eşleştirme tablosuna bakıyor.
txt
uzantısının Notepad ile eşleştirildiğini görüyor ve bizim “list.txt” şeklinde
verdiğimiz komutu “Notepad list.txt” şekline çeviriyor.
(İçinden de “tih tih aptal herif, yine komutu tam yazmadı, neyse ben komutu
olması gerektiği gibi yazayım” diyor da olabilir.)
Komut satırında dosya uzantıları ve uygulama
eşleştirmelerini görüp yönetmek için kullanacağımız bir komut var: “assoc”.
“assoc”
komutu “associate” (eşleştir, ilişkilendir)
sözcüğünün kısaltması. Komutun çıktısı aşağıdaki gibi olacaktır:
Assoc komutu bilinen tüm dosya uzantılarını listelediği
için ve liste kayıp gittiği için yukarıdaki resmi kırpma yoluyla elde ettim.
Ama istediğim yalnızca .txt uzantısıyla ilgili
eşleştirmeyi görmek olsaydı komutu “assoc .txt” şeklinde verebilirdim.
Neyse, assoc komutunu
verdik, .txt uzantısını gördük.
Ama .txt uzantısıyla ilgili olarak bir uygulama adı
yazmıyor, yalnızca “txtfilelegacy” (“eski türden bir
metin dosyası”) şeklinde bir sınıflandırma ifadesi yazıyor.
Txtfilelegacy
ifadesinin hangi uygulamayla eşleştirildiğini görmek için Registry’ye
gitmemiz gerek.
Registry’de
“txtfilelegacy” ifadesini arattığımızda, ikinci sonuç
\HKEY_CLASSES_ROOT\ altında yer alıyor ve tam istediğimiz bilgileri içeriyor:
Tüm bu bilgilerden şunu anlıyoruz: Komut satırında txt
uzantılı bir dosya adını sanki bir komutmuş gibi verdiğimizde işletim sistemi Registry’deki bilgileri kullanarak uzantının kategorisini
buluyor, sonra o kategorinin hangi uygulamayla ilişkili olduğunu saptıyor,
kullanıcının girdiği ve aslında yanlış olması gereken komutu düzenleyip doğru
hale getiriyor, dosyayı uygulamayla açıyor.
Buraya kadar tamam. Şimdi de Powershell’e
bakalım.
Powershell
halen klasik komut satırı kadar bağışlayıcı değil.
Eğer Powershell’de doğrudan
dosyanın adını yazıp Enter’a basarsak bir hata mesajı
alırız:
Aslında Powershell de dosya
uzantılarını, ilişkili uygulamaları biliyor ama ille de komut ve komut nesnesi
ifadelerinin düzgün şekilde girilmesini istiyor.
Powershell
içinde komutu “Notepad list.txt” şeklinde verirsek Notepad çalıştırılır,
list.txt dosyası açılır.
Peki, Powershell içinde
uygulama adı vermeden yalnızca dosya adı vererek amacımıza ulaşmanın yolu var
mıdır?
Vardır. Hem de iki adet.
Birinci yöntemde dosyanın adını doğrudan değil de “.\”
işaretlerinden sonra veriyoruz. Yani, komutu .\list.txt şeklinde veriyoruz. Bu
durumda, aynen klasik komut satırında olduğu gibi dosyamız analiz ediliyor, bir
komut değil bir veri dosyası olduğu anlaşılıyor, ilişkili uygulama bulunuyor
(Notepad) ve o uygulama ile açılıyor.
İkinci yol ise “Invoke-item”
komutunu kullanmaktır. Invoke-item komutu, komuttan
sonra gelen nesneyi uygun bir şekilde işle demektir. Powershell’de
şu komutu verelim:
Invoke-item list.txt
Bunu yaptığımızda Invoke-item
komutu nesne ifadesine bakar, dosya uzantısıyla ilgili eşleştirme bilgisini Registry’den alır, list.txt dosyasını Notepad ile açar.
Eee,
doğrudan Notepad list.txt komutunu verseydik ya diyebilirsiniz, doğru da
dersiniz.
Ama dosyanın uzantısını tanımadığınızı, hangi
uygulamayla ilişkili olduğunu bilmediğinizi varsayalım.
Bu durumda invoke-item eksik
bilgiyi Registry’den getireceği için dosyanın uygun
bir uygulamayla açılmasını sağlar.
Invoke-item
başka işlere de yarar. Şimdi şu komutu verelim:
Invoke-item
c:\windows
Bu komutu verdiğimizde C: sürücüsündeki Windows
klasörünün içeriği grafik ortamda, Explorer programında karşımıza çıkartılır.
Bu işlevi, bir Powershell betiği içindeyken kullanıcının karşısına bir
klasörün içeriğini çıkartmak için kullanabiliriz.
Komut satırlarının mantığını anlamak, istediğimiz
işleri daha kolay yapabilmemiz sağlar.