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:

metin, ekran görüntüsü, yazı tipi içeren bir resim

Açıklama otomatik olarak oluşturuldu

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:

metin, ekran görüntüsü, yazılım, bilgisayar simgesi içeren bir resim

Açıklama otomatik olarak oluşturuldu

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:

metin, ekran görüntüsü, yazı tipi, tasarım içeren bir resim

Açıklama otomatik olarak oluşturuldu

 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’detxtfilelegacy” ifadesini arattığımızda, ikinci sonuç \HKEY_CLASSES_ROOT\ altında yer alıyor ve tam istediğimiz bilgileri içeriyor:

metin, ekran görüntüsü, çizgi, yazı tipi içeren bir resim

Açıklama otomatik olarak oluşturuldu

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:

metin, ekran görüntüsü, yazı tipi içeren bir resim

Açıklama otomatik olarak oluşturuldu

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.

metin, ekran görüntüsü, yazılım, bilgisayar simgesi içeren bir resim

Açıklama otomatik olarak oluşturuldu

 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.