Değişkenler bir ifadenin içine tanımlanmış değerdir. Batch kodlama dilinde sıkça kullanacağımız önemli unsurlardandır. Değişkenlere doğrudan değer tanımak dışında kullanıcıdan bir değişkene değer tanımlamasını isteyebilirsiniz, matematiksel işlemler değişkenler içinde yapılır. Hata mesajları yani errorlevel değişkeni ile mantıksal sorgulama yapabilirsiniz.
Batch üzerinden değişkenler set komutuyla tanımlanmaktadır.
Değişken nasıl tanımlanır?
:: Aşağıda Value değişkenine 1234 değerini tanımladım.
:: Value yerine değişken adı olarak istediğiniz bir ifadeyi kullanabilirsiniz.
Set Value=1234
:: Değişkenimizi görmek istediğimizde tanımladığımız ifadeyi % arasına alıyoruz.
echo %Value%
Değişken içinde matematiksel işlem nasıl yapılır?
Bu konuyu operatörler konusunda işlemiştik ancak konu bütünlüğü adına yeniden yazmak istedim.
:: Value değişkeni içinde 5+4 toplama işlemini yaptık.
Set /a Value=5+4
:: İşlem sonrası echo komutuyla Value değişkenine bakıyoruz.
echo %Value%
Kullanıcıdan değişkene değer tanımlaması nasıl istenir?
Bu işlem için set /p komutunu kullanacağız.
:: Value değişkeni içine kullanıcıdan bir değer girmesini istedik.
:: Set/p Value= buradan sonrası için ekranda görünmesini istediğiniz mesajı yazabilirsiniz.
set /p Value=Lütfen bir değer giriniz=
:: Tanımlama işleminden sonra echo komutuyla değişkenimizi kontrol ediyoruz.
echo %Value%
Çevresel değişkenler hakkında
Aşağıda yazdığım çevresel değişkenler Windows sistemlerinde tanımlı olarak gelmektedir. Bir ifade içine tanımlanmış klasör yollarını barındırır. Bazılarıyla daha önceden karşılaşmış olma ihtimaliniz oldukça yüksektir. Çevresel değişkenler batch kodlama da çok fazla işimize yaramaktadır.
:: %homepath% çevresel değişkeninin yaptığım çalışmalarda yer yer buglanıp yol vermediğini fark ettim. Çalışmalarınızda kullanmanızı tavsiye etmem.
%homepath% = C:\Users\%username%
:: %username% çevresel değişkeni NSudo gibi programlarla Trusted installer yetkisi aldığınızda komut dosyasında kullanıcı adınızı değil bilgisayar adını tutar.
%username% = Kullanıcı adını barındırır.
%homedrive% = Sistemin kurulu olduğu diskin harfini tutar
%systemdrive% = Sistemin kurulu olduğu diskin harfini tutar
%programfiles% = C:\Program Files
%programfiles(x86)% = C:\Program Files (x86)
%CommonProgramFiles% = C:\Program Files\Common Files
%CommonProgramW6432% = C:\Program Files\Common Files
%CommonProgramFiles(x86)% = C:\Program Files (x86)\Common Files
%ProgramData% = C:\ProgramData
%temp% = C:\Users\%username%\AppData\Local\Temp
%appdata% = C:\Users\%username%\AppData\Roaming
%localappdata% = C:\Users\%username%\AppData\Local
%windir% = C:\Windows
%systemroot% = C:\Windows
Değişken içeriği nasıl işlenir?
Batch kodlama yaparken değişkenler içinde yer yer belli bölümlerini almamız gerekebiliyor. Aşağıda farklı şekillerde verdiğim örnekler ile ihtiyacınıza yönelik düzenleme yapabilirsiniz.
set Value=12345
:: -------------
echo %Value:~0,1% │Çıktı= 1
:: Value değişkeninde index 0'dan başlayıp 1'e kadar almasını istedik.
echo %Value:~1,1% │Çıktı= 2
:: Value değişkeninde index 1'den başlayıp 1'e kadar almasını istedik.
echo %Value:~0,2% │Çıktı= 12
:: Value değişkeninde index 0'dan başlayıp 2'e kadar almasını istedik.
echo %Value:~1,2% │Çıktı= 23
:: Value değişkeninde index 1'den başlayıp 2'e kadar almasını istedik.
echo %Value:~1% │Çıktı= 2345
:: Value değişkeninde index 1'den başlayıp tamamını almasını istedik.
echo %Value:~-1% │Çıktı= 5
:: Value değişkeninde son index'i almasını istedik.
echo %Value:~-2% │Çıktı= 45
:: Value değişkeninde son iki index'i almasını istedik.
echo %Value:~0,-2% │Çıktı= 123
:: Value değişkeninde son iki index'i almamasını istedik.
echo %Value:~0,-1% │Çıktı= 1234
:: Value değişkeninde son index'i almamasını istedik.
Call değişkenleri nasıl kullanılır?
Call komutu çağrı anlamına gelir. Çağrı yaptığımız başlığa 9 adet değişken gönderme imkanı sunar. Batch kodlama yaparken sıkça kullanabileceğiniz komutlardandır.
:: Çağrı yaptığımız başlık %~0 değerinde bulunur. Batchla ilgilendiğim uzun zaman içinde başlığı öğrenmek için hiç kullanmadım. İhtiyacınız olmayacak ancak bilginiz olsun.
:: ~ dalgalı tire aşağıya gönderilen verilerden tırnak işaretlerini kaldırır.
:: Call ile çağrı yaptığımız bölüme gönderdiğimiz veriler arasına her boşluk girdiğinde değişken değeri farklı olur.
::
:: Örnek 1;
Call :Ornek Test1
:Ornek
echo %~1 │Çıktı= Test1
goto :eof
::
:: Örnek 2;
Call :Ornek Test 1
:Ornek
echo %~1 │Çıktı= Test
echo %~2 │Çıktı= 1
goto :eof
::
:: Örnek 3;
Call :Ornek "Test 1"
:Ornek
echo %~1 │Çıktı= Test 1
echo %1 │Çıktı= "Test 1"
goto :eof
::
:: Genel Örnek;
Call :Ornek Test1 Test2 Test3 "Test 4" "Test 5" Test6 "Test 7" Test8 "Test 9"
pause
:Ornek
echo %~0 │Çıktı= Ornek
:: %~0 değişkeni Call komutu dışında yol tanımında da kullanılır. Ancak tam yol tanımı için asla bu haliyle kullanmayın. "%~f0" "%~s0" olarak kullanın. Alt bölümde bu terimlerin örnekleri ve açıklamaları var.
echo %~1 │Çıktı= Test1
echo %~2 │Çıktı= Test2
echo %~3 │Çıktı= Test3
echo %~4 │Çıktı= Test 4
echo %~5 │Çıktı= Test 5
echo %~6 │Çıktı= Test6
echo %~7 │Çıktı= Test 7
echo %~8 │Çıktı= Test8
echo %~9 │Çıktı= Test 9
echo %* │Çıktı= Test1 Test2 Test3 "Test 4" "Test 5" Test6 "Test 7" Test8 "Test 9"
:: %* parametresi ile Call komutuyla satıra yazdığımız tüm içeriği olduğu gibi alırız.
goto :eof
Errorlevel değişkeni nasıl kullanılır?
Batch kodlamada yaptığımız sorgularda hata durumu errorlevel değişkenine tanımlanır. Bu değişkeni mantıksal sorgularla kontrol edip yönlendirme veya bilgilendirme mesajı ekleyebilirsiniz. Errorlevel değişkenlerinin çıktıları;
0 = Hatasız
1 = Hatalı
Errorlevel değişkeni içinde sadece bu iki tanım yer almamaktadır. Yerine ve sorguya göre farklı tanımlarda olacaktır. Bundan dolayı hatalı ve hatasız durumları EQU ve NEQ mantıksal operatörleri ile kontrol ettirmeniz daha sağlıklı sonuçlar verecektir.
:: dir /b komutuyla hedeflediğim dosyanın var olup olmadığını kontrol ediyorum.
:: > NUL 2>&1 ile işlem çıktısını gizliyorum.
dir /b C:\OgnitorenKs.Toolbox\OgnitorenKs.Toolbox.cmd > NUL 2>&1
:: if ile errorlevel değişkeninin 0 (sıfır) yani hatasız olduğu duruma göre echo ile bilgi mesajı verdim.
if %errorlevel% EQU 0 (echo Dosya bulundu.)
:: if ile errorlevel değişkeninin 0 (sıfır) yani hatasız olmadığı duruma göre echo ile bilgi mesajı verdim.
if %errorlevel% NEQ 0 (echo Dosya bulunamadı.)
For döngüleri içinde değişkenler nasıl kullanılır?
FOR döngüleri içinde değişken kullanmak için çalışmamızın başına setlocal enabledelayedexpansion komutunu eklememiz gerekiyor. Bu komutu eklemeden FOR döngüleri içinde yapacağımız errorlevel değişkeni hatalı sonuçlar verecektir. Ayrıca FOR döngüleri içinde yapacağımız değişken tanımlamalarını okuması için kesinlikle kullanmamız gereken vazgeçilmez unsurlardandır.
Ancak bu tanımları yaparken değişkenlerimizi % işareti kullanarak değil ! işareti kullanarak göstereceğiz.
Bazı durumlarda & operatörü kullanıldığında aynı satır içinde tanımlanan değişkenlerde okunamayabiliyor. Bu durumda değişkeni % ile değil ! ile göstermelisiniz.
Aşağıda örnek bir çalışmayla detaylarını göstermeye çalıştım.
:: echo off ile çıktıları gizledik
echo off
:: chcp 65001 ile Türkçe karakter hatasını giderdik
chcp 65001
:: FOR döngüleri için değişken hatasını giderdik
setlocal enabledelayedexpansion
:: Komut ekranını temizledik
cls
:: Dism ile yüklü paketleri C diskinde Paketler.txt içine yazdırıyorum.
Dism /Online /Get-Capabilities /format:table > C:\Paketler.txt
:: FOR döngüsü ile C:\Paketler.txt içinden Findstr ile "NetFX3~~~~" ifadesini aramasını istedim.
:: tokens=3 ile Findstr ile bulduğu değerden 3. indexi almasını istedim.
:: Sorgulamak istediğim değer 3.index'te yer aldığı için tokens=3 kullandım.
FOR /F "tokens=3" %%g in ('Findstr /C:"NetFX3~~~~" C:\Paketler.txt') do (
:: Döngü değişkeni olarak %%g kullanmıştım.
:: echo ile değişkeni yazıp Findstr ile "Installed" değerini sorgulatıyorum.
:: > NUL 2>&1 ile çıktıyı gizledim.
echo %%g | Findstr /C:"Installed" > NUL 2>&1
:: if sorgusuyla errorlevel değişkenini sorguladım.
:: Dikkat ederseniz ! kullandım.
:: NEQ mantıksal opearatörüyle 0 (sıfır) yani başarılı çıktı dışında kalan bir tanımlama var ise .Net Framework 3.5 yüklü değil mesajı verecek şekilde düzenledim.
:: Bu bölümde Dism ile yükleme komutu vererek yeniden yükleme işlemi yapabilirsiniz.
if !errorlevel! NEQ 0 (echo .Net Framework 3.5 yüklü değil)
)
pause
For döngüsü içinde veya Call komutunda yol tanımlı değişkenler nasıl işlenir?
Değişken içine tanımlı yolun yapılan kodlamaya göre farklı bölümlerini alıp işlememiz gerekebiliyor. Özellikle tam yol verilmişse yalnızca dosya adını veya uzantısını almamız gerekebilir. Bunun için batch içinde güzel bir çözüm bulunmaktadır.
Call komutu için örnek;
:: Örnek yol olarak tanımladık "C:\Test\OgnitorenKs.cmd" yolunu kullandık.
Call :Ornek "C:\Test\OgnitorenKs.cmd"
pause
:: ~ dalgalı tire işareti aşağıdaki harfli örneklerde gibi kullanılmak zorundadır
:Ornek
echo %~f1 - tam yol olarak verir. │Çıktı= C:\Test\OgnitorenKs.cmd
echo %~d1 - Sürücü harfini verir. │Çıktı= C:
echo %~p1 - Yalnızca yolu verir. Disk harfini ve dosya yolunu almaz. │Çıktı= \Test\
echo %~n1 - Dosya adını verir. │Çıktı= OgnitorenKs
echo %~x1 - Dosya uzantısını verir. │Çıktı= .cmd
echo %~s1 - Yolu genişletilmiş olarak verir. │Çıktı= C:\Test\OgnitorenKs.cmd
echo %~a1 - Dosya özniteliklerine genişletir. │Çıktı= --a--------
echo %~t1 - Dosyanın tarih/saatine genişletir. │Çıktı= 08.04.2023 05:31
echo %~z1 - Dosya boyutuna genişletir. │Çıktı= 0
:: Harfleri aşağıdaki gibi birlikte kullanabilirsiniz.
echo %~dp1 - Disk harfi ve yolu verir. │Çıktı= C:\Test\
echo %~nx1 - Dosya adı ve uzantısını verir. │Çıktı= OgnitorenKs.cmd
goto :eof
For komutu için örnek;
:: For döngüsü ile C:\Test klasörü içinde .cmd uzantılı dosyaları arattım
FOR /R C:\Test\ %%a in (*.cmd) do (
echo %%~fa │Çıktı= C:\Test\OgnitorenKs.cmd
echo %%~da │Çıktı= C:
echo %%~pa │Çıktı= \Test\
echo %%~na │Çıktı= OgnitorenKs
echo %%~xa │Çıktı= .cmd
echo %%~sa │Çıktı= C:\Test\OgnitorenKs.cmd
echo %%~aa │Çıktı= --a--------
echo %%~ta │Çıktı= 08.04.2023 05:31
echo %%~za │Çıktı= 0
:: Harfleri aşağıdaki gibi birlikte kullanabilirsiniz.
echo %~dpa │Çıktı= C:\Test\
echo %~nxa │Çıktı= OgnitorenKs.cmd
)