CMD mi PowerShell mi? Windows'ta İki Komut Satırının Farkı ve Kullanım Yeri
Windows'ta iki komut satırı yan yana durur: eski toplu iş dosyalarının dünyası olan Komut İstemi ve nesnelerle çalışan PowerShell. Hangisini açacağınızı, yapacağınız işin tek bir komut mu yoksa tekrar eden bir otomasyon mu olduğu belirler.
Bir bakışta
- CMD komutların metin çıktısını, PowerShell .NET nesnelerini taşır. PowerShell'de bir dosyanın boyutunu almak için çıktıyı ayrıştırmak gerekmez; nesnenin özelliğine doğrudan erişilir.
- PowerShell, CMD'nin çalıştırdığı Windows komutlarını da çalıştırır; tersi geçerli değildir. Microsoft'un belgesine göre Komut İstemi PowerShell cmdlet'lerini çalıştıramaz.
- Microsoft, Windows otomasyonu için PowerShell'i önerir. Var olan toplu iş dosyaları çalışmaya devam eder; yeni otomasyon PowerShell'de yazılır.
- Tek seferlik basit komutlarda iki kabuk da iş görür; fark tekrar eden işte ortaya çıkar. Hata yönetimi, uzak yönetim, modüller ve veri biçimleri PowerShell'in otomasyondaki üstünlüğüdür.
İki kabuk, iki kuşak
Microsoft'un Windows komutları belgesine göre Windows'ta iki komut satırı kabuğu bulunur: Komut kabuğu, yani Komut İstemi (cmd.exe), ve PowerShell. Komut İstemi, kullanıcı hesabı yönetimi ya da gece yedeklemesi gibi rutin işleri toplu iş (.bat) dosyalarıyla otomatikleştirmek için Windows'a yerleştirilmiş ilk kabuktur. PowerShell ise Komut İstemi'nin yeteneklerini genişletmek ve cmdlet adı verilen PowerShell komutlarını çalıştırmak için tasarlanmıştır.
Aynı belge iki önemli noktanın altını çizer. Birincisi, PowerShell içinde hem Windows komutları hem de cmdlet'ler çalışır, ancak Komut İstemi yalnız Windows komutlarını çalıştırabilir. İkincisi, Microsoft güncel ve sağlam Windows otomasyonu için Windows komutları yerine PowerShell kullanılmasını önerir.
PowerShell bugün yalnız bir Windows kabuğu da değildir: Microsoft'un tanımıyla komut satırı kabuğu, betik dili ve yapılandırma yönetimi çerçevesinden oluşan, Windows, Linux ve macOS'ta çalışan çok platformlu bir otomasyon çözümüdür.
Asıl fark: metin mi, nesne mi?
Komut İstemi'nde bir komutun çıktısı ekrana yazılan metindir. Bu metni başka bir komuta aktarabilirsiniz, ama alan komut onu yine metin olarak görür. Örneğin bir klasördeki dosyaları boyuta göre listelemek için dir komutu sıralama seçeneğiyle çalıştırılır; dosya boyutunu bir hesaplamada kullanmak isterseniz çıktının ilgili sütununu metin işleme yoluyla ayıklamanız gerekir.
Microsoft'un açıklamasıyla PowerShell, çoğu kabuğun aksine metin değil .NET nesneleri alır ve döndürür; bu yüzden çıktıyı ayrıştırmaya gerek kalmaz. Aynı işi PowerShell'de şöyle yaparsınız: Get-ChildItem | Sort-Object Length -Descending | Select-Object Name, Length Burada Get-ChildItem her dosya için bir nesne üretir; Sort-Object bu nesnelerin Length özelliğine göre sıralar, Select-Object yalnız istenen özellikleri seçer. Sonucu bir CSV ya da JSON dosyasına yazmak için de yerleşik dönüştürme komutları kullanılır.
Bu fark küçük işlerde göze çarpmaz, ama bir betik büyüdükçe belirleyici hale gelir: metin ayrıştıran betikler dil, tarih biçimi ya da sütun genişliği değiştiğinde bozulur; nesne özelliklerini kullanan betikler bu değişikliklerden etkilenmez.
Temel farklar ölçüt ölçüt
- Veri modeli: CMD, metin / PowerShell, .NET nesneleri.
- Komutlar: CMD, Windows komutları (dir, copy, ipconfig gibi) / PowerShell, cmdlet'ler, işlevler, modüller ve Windows komutları.
- Betik dosyası: CMD, .bat ya da .cmd uzantılı toplu iş dosyaları / PowerShell, kendi betik dosyaları ve modüller.
- Değişkenler: CMD, %USERNAME% biçiminde ortam değişkenleri, sınırlı veri türü / PowerShell, $ ile başlayan değişkenler, diziler, sözlükler, ortam değişkenleri için $env:USERNAME.
- Hata yönetimi: CMD, çıkış kodunun %ERRORLEVEL% ile kontrolü / PowerShell, try, catch ve finally blokları, ayrıntılı hata nesneleri.
- Uzak yönetim ve kapsam: CMD, yerel makine odaklı / PowerShell, uzak oturumlar, Azure, Exchange, SQL Server gibi ürünler için modüller.
- Platform: CMD, yalnız Windows / PowerShell, Windows, Linux ve macOS.
- Öğrenme eğrisi: CMD, birkaç komutla hızlı başlangıç, karmaşık mantıkta zorlanır / PowerShell, söz dizimi daha uzun ama tutarlı; Fiil-Ad adlandırması ve yerleşik yardım keşfi kolaylaştırır.
Hangi durumda hangisi?
Günlük kullanımda seçim, işin niteliğine göre yapılır.
- Tek seferlik, kısa bir komut çalıştıracaksanız (ağ ayarını görmek, bir bağlantıyı test etmek, bir klasöre geçmek) iki kabuk da yeterlidir. Windows komutları PowerShell'de de çalıştığı için PowerShell penceresinden çıkmanıza gerek yoktur.
- Var olan bir toplu iş dosyasını çalıştıracak ya da küçük bir düzeltme yapacaksanız CMD'de kalmak mantıklıdır; çalışan eski betikleri sırf dönüştürmek için yeniden yazmak her zaman gerekli değildir.
- Yeni bir otomasyon yazacaksanız, özellikle hata yönetimi, döngü, koşul ya da veri işleme içeriyorsa PowerShell seçilir.
- Active Directory, Exchange, Azure ya da birden çok sunucu yönetiliyorsa PowerShell gerekir; bu ürünlerin yönetim modülleri PowerShell için yazılmıştır.
- Betik Linux ve macOS'ta da çalışacaksa PowerShell çok platformlu olduğu için tek kod tabanı sağlar; yalnız Linux ortamı için Bash da bir seçenektir.
Tek komutta fark küçüktür; otomasyon PowerShell'e gider
- Tek seferlik kısa bir Windows komutuİkisi de yeterli
- Var olan bir toplu iş dosyasını çalıştırmak ya da düzeltmekCMD'de kalmak mantıklı
- Hata yönetimi, döngü ya da veri işleme içeren yeni otomasyonPowerShell
- Active Directory, Azure ya da çok sunuculu yönetimPowerShell modülleri
CMD alışkanlıklarıyla PowerShell yazarken
CMD'den PowerShell'e geçenler genellikle eski alışkanlıklarını yeni kabukta sürdürür ve PowerShell'in getirdiği avantajları kullanmadan uzun betikler yazar.
- Çıktıyı metin olarak ayıklamaya çalışmak yerine nesnenin özelliğini kullanın; dosya boyutu için Length, servis durumu için Status gibi.
- Ortam değişkenlerine %USERNAME% biçiminde değil, $env:USERNAME biçiminde erişin.
- Hata kontrolünü yalnız çıkış koduna bırakmayın; cmdlet hatalarını try ve catch ile yakalayın. Harici programların çıkış kodu için $LASTEXITCODE değişkeni kullanılır.
- Etkileşimli kullanımda kolaylık sağlayan takma adları (dir, ls, cd gibi) betiklerde kullanmayın; tam cmdlet adları betiği başkaları için okunur kılar.
- Her şeyi tek bir uzun komut satırında çözmeye çalışmak yerine işlevler ve parametreler tanımlayın; böylece betik test edilebilir ve yeniden kullanılabilir olur.
PowerShell'in gücü, CMD alışkanlıkları bırakıldığında ortaya çıkar
Sık karşılaşılan sorunlar
- Betik çalışmıyor: Windows'ta PowerShell betiklerinin çalışması yürütme ilkesiyle denetlenir; kuruluşun güvenlik politikasını devre dışı bırakmak yerine ilkenin neden betiği engellediği anlaşılmalı ve betik imzalama gibi kurumsal yöntemler değerlendirilmelidir.
- Aynı komut farklı sonuç veriyor: bazı Windows komutlarının PowerShell'de aynı adlı takma adı vardır; örneğin dir PowerShell'de Get-ChildItem'i çağırır ve CMD'deki seçenekleri kabul etmez. CMD davranışı gerekiyorsa komut cmd /c ile çalıştırılabilir.
- Özel karakterler: CMD'de kaçış için ^ kullanılırken PowerShell'de ters tırnak kullanılır; tırnak ve boşluk içeren yollar iki kabukta farklı ele alınır.
- İki PowerShell sürümü: Windows ile gelen Windows PowerShell ve ayrıca kurulan çok platformlu PowerShell yan yana bulunabilir; betiğin hangisinde test edildiği belgelenmelidir.
Mindset programlarında PowerShell
PowerShell ile Windows Otomasyonu eğitimi, PowerShell temelleri ve nesne modelinden başlayıp değişkenler ve akış kontrolüne, işlev yazımı ve hata yönetimine, sistem ve dizin yönetimi otomasyonuna, uzak yönetim ve güvenliğe ve modül paketleme ile zamanlanmış görevlere ilerler. Tekrarlayan yönetim işlerini CMD betiklerinden PowerShell'e taşımak isteyen sistem yöneticileri ve destek ekipleri için uygundur.
PowerShell'i Active Directory ve sunucu yönetimiyle birlikte kullanacak olanlar için Windows Server Yönetimi ve Active Directory İşletimi eğitimi tamamlayıcıdır.
İlgili Mindset programı
PowerShell ile Windows Otomasyonu
Sık sorulan sorular
PowerShell CMD'nin yerini tamamen aldı mı?
Komut İstemi Windows'tan kaldırılmadı ve toplu iş dosyaları çalışmaya devam ediyor. Ancak Microsoft, güncel Windows otomasyonu için PowerShell'i öneriyor ve yeni yönetim araçlarının büyük bölümü PowerShell modülleri olarak geliyor. Pratikte CMD, eski betikler ve hızlı tek komutlar için kalırken yeni otomasyon PowerShell'de yazılıyor.
CMD komutları PowerShell'de çalışır mı?
Windows komutları, yani ipconfig, ping ya da robocopy gibi ayrı programlar, PowerShell'de doğrudan çalışır. CMD'nin kendi içine gömülü bazı komutları ise PowerShell'de aynı adlı takma adlara karşılık gelir ve farklı seçenekler kabul eder. Böyle durumlarda komutu cmd /c ile çalıştırmak ya da PowerShell karşılığını kullanmak gerekir.
Toplu iş dosyalarını PowerShell'e çevirmeye değer mi?
Sorunsuz çalışan ve değişmeyen basit bir toplu iş dosyasını yeniden yazmanın getirisi azdır. Betik sık değişiyorsa, hata durumunda sessizce yanlış sonuç üretiyorsa ya da metin ayrıştırmaya dayanıyorsa PowerShell'e çevirmek bakım yükünü azaltır. Çeviri, betiği aynı adımlarla değil, nesne ve hata yönetimi mantığıyla yeniden tasarlama fırsatıdır.
Windows Terminal ile PowerShell aynı şey mi?
Değildir. Windows Terminal, içinde farklı kabukların sekmeler halinde açılabildiği bir terminal uygulamasıdır. Aynı pencerede bir sekmede Komut İstemi, diğerinde PowerShell ya da bir Linux kabuğu çalıştırılabilir. Kabuk komutları yorumlar, terminal ise bu kabukları gösteren arayüzdür.
Önce CMD öğrenip sonra PowerShell'e mi geçmeliyim?
Gerekli değildir. CMD'den yalnız sık kullanılan birkaç Windows komutunu bilmek yeterlidir ve bu komutlar PowerShell'de de çalışır. Doğrudan PowerShell ile başlamak, nesne mantığını ve otomasyon alışkanlıklarını baştan doğru kurmayı sağlar; eski toplu iş dosyalarını okumak gerektiğinde CMD söz dizimi kısa sürede öğrenilir.
İlgili rehberler
İlgili eğitimler
Kategori: DevOps ve Bulut Teknolojileri