Forum: D Programlama Dili RSS
Sistem Bilgisini Nasıl Parçalayabilirim?
agora #1
Üye Tem 2013 tarihinden beri · 221 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Sistem Bilgisini Nasıl Parçalayabilirim?
Selam.

Konu başlığına bakınca biraz ilginç görünmüş olabilir. Ama yapmak istediğim bir şey var burada yine bana aracı olarak D var yardım edecek yegane dostum :)

Neyse anlatayım

Windows'ta CMD'ye systeminfo yazınca şu çıktıları aldım (Hotfix'i sildim baya güncelleştirme içeriyor çünkü uzamasın diye)

Host Name:                 ALI
OS Name:                   Microsoft
OS Version:                6.2.9200 N/A Build 9200
OS Manufacturer:           Microsoft Corporation
OS Configuration:          Standalone Workstation
OS Build Type:             Multiprocessor Free
Registered Owner:          admin
Registered Organization:
Product ID:                00178-90000-00011-AA119
Original Install Date:     29.4.2013, 13:52:21
System Boot Time:          17.6.2014, 09:45:06
System Manufacturer:       ARCELIK A.S.
System Model:              1TE-ANB 593 A1GP
System Type:               x64-based PC
Processor(s):              1 Processor(s) Installed.
                           [01]: Intel64 Family 6 Model 23 Stepping 10 GenuineIn
tel ~2200 Mhz
BIOS Version:              ARCELIK A.S.     1.07, 1.12.2009
Windows Directory:         C:\Windows
System Directory:          C:\Windows\system32
Boot Device:               \Device\HarddiskVolume1
System Locale:             tr;Türkçe
Input Locale:              tr;Türkçe
Time Zone:                 (UTC+02:00) İstanbul
Total Physical Memory:     2.043 MB
Available Physical Memory: 559 MB
Virtual Memory: Max Size:  3.451 MB
Virtual Memory: Available: 1.259 MB
Virtual Memory: In Use:    2.192 MB
Page File Location(s):     C:\pagefile.sys
Domain:                    WORKGROUP
Logon Server:              \\ALI
Hotfix(s): 97 Hotfix(s) installed
 
Network Card(s):           2 NIC(s) Installed.
                           [01]: Realtek PCIe GBE Family Controller
                                 Connection Name: Ethernet
                                 Status:          Media disconnected
                           [02]: Broadcom 802.11g Ağ Bağdaştırıcısı
                                 Connection Name: Wi-Fi
                                 DHCP Enabled:    Yes
                                 DHCP Server:     192.168.1.1
                                 IP address(es)
                                 [01]: 192.168.1.4
                                 [02]: fexxxx
Hyper-V Requirements:      VM Monitor Mode Extensions: No
                           Virtualization Enabled In Firmware: No
                           Second Level Address Translation: No
                           Data Execution Prevention Available: Yes

Ben bu çıktılardaki sol tarafta görünenleri ve sağındaki eşleşenleri ayırmak istiyorum. Örneğin Hyper-V Req kısmını değil de sağında sistemin sunduğu kısmı almak istiyorum ve bir değişkene atamak istiyorum. Ama bunları nasıl parçalarım ve ayırırım bilmiyorum. Ya da D bunları sunan bir olanağa sahip mi?

HDD boyutu, kullanılan alan, boş alan gibi bilgileri de almam gerekiyor ayrıca.

Bunu unix ve linux için de yapacağım. linux için koding var online yapar deneyebilirim :)

Teşekkürler.
agora #2
Üye Tem 2013 tarihinden beri · 221 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Şöyle;

systeminfo | findstr /C:"Processor(s)"

Bir kod ile karşısındakini veriyor bana. Ancak mesela bu kodun karşısında ayrıca

[01]: Intel64 Family 6 Model 23 Stepping 10 GenuineIn

yazıyordu onu vermedi.
acehreli (Moderatör) #3
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #1
Aşağıdaki program sol ve sağ parçaları elde ediyor:
import std.stdio;
import std.algorithm;
import std.string;
import std.array;
 
immutable ayraç = ":";
immutable atlanacaklar = [ "Processor(s)",
                           "Network Card(s)",
                           "Hyper-V Requirements" ];
 
void main()
{
    auto dosya = File("sistem_bilgisi");
 
    foreach (_; dosya.byLine) {
        auto satır = _.idup;    // Bizim için kopyasının alınması şart çünkü
                                // byLine hep aynı geçici satırı kullanır.
 
        // findSplit üç parçaya ayırır: aranandan öncesi, aranan, ve aranandan
        // sonrası.
        auto parçalar = satır.findSplit(ayraç);
 
        if (parçalar[1].empty) {
            // Satırda ayraç bulamadık; devam...
 
        } else {
            auto solTaraf = parçalar[0].strip;
 
            if (!solTaraf.empty && !atlanacaklar.canFind(solTaraf)) {
                auto sağTaraf = parçalar[2].strip;
                writefln("%s ===> %s", solTaraf, sağTaraf);
            }
        }
    }
}
Ali
agora #4
Üye Tem 2013 tarihinden beri · 221 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Hocam tam emin degilim ama bir yerde sanirim hata olmali. Belki windows izinlerindendir diye dusundum dosya olusturmadi ben olusturdum ama dosyanin icine bir sey yazmiyor.

Bu konuyu actiktan hemen sonra WMIC diye harika bir cmd bölümü kesfettim. Buradaki olay resmen daha basit :) Ama hala ben [01]: Intel64 Family 6 Model 23 Stepping 10 GenuineIn gibi bunu nasil veriyor cozebilmis degilim.

Bir de wmic sanirim Windows hakkinda sevdigim tek bolum olacak :D

wmic nasil kullanilir bir bilsem

wmic os get serialnumber yazınca

SerialNumber
00178-90000-00011-AA119

gösteriyor bana. Ancak internette gördüğüm wmic dokumanlari cok farkli. İnternetteki dökümanlar

CPU                 - CPU

gibi veriyor bana os get serialnumber veren yer yok bunları bulabilsem aslında sanırım daha kolay olacak gibi sanki?
agora #5
Üye Tem 2013 tarihinden beri · 221 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
spam yapiyormusum gibi olacak ama wmic ile daha basit ogrendim

wmic GEREKEN yazinca ornegin

wmic bios yazarsak alt basliklari getiriyor.

ben wmic bios yazdim serialnumber diye bir altbaslik gordum bir suru geliyor gerci :D wmic bios get serialnumber yazarsa bios seri numarasi geliyor. manufacturer vs. bir cok ozellik var.

Bunlari direkt alabilirsem super olur.

Mesajı yazmadan almayı denedim

import std.stdio;
import std.process;
 
void main()
{
    string a = "wmic bios get serialnumber";
    string b = "wmic os get serialnumber";
    system(a);
    system(b);
};

Çıktı olarak:

SerialNumber
927160XXXXX
 
SerialNumber
00178-9XXX-XXX-XXX-XX

Verdi. Vay çalışıyor tam da istediğim şeyi başardım aslında :D Geriye tek bir problem kaldı bu regex işlerinden anlasam sorun kalmayacak aslında

Üstteki SerialNumber yazan kısımları nasıl silebilirim? Bunu silsem basit bir fonksiyonu olsa mukemmel olacak
acehreli (Moderatör) #6
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #4
agora:
dosya olusturmadi

Benim gösterdiğim kod "sistem_bilgisi" adlı dosyadan okuyordu. Standart girişten okumasını istiyorsan 'dosya'yı boşver ve doğrudan stdin.byLine diye devam et.

Bir programın standart çıkışını başka bir programın standart girişine bağlamayı biliyorsun, değil mi? Senin programının adı 'deneme' olsa:
# systeminfo | deneme
Artık bilgiyi deneme'nin stdin akımında görürsün.

Ali
agora #7
Üye Tem 2013 tarihinden beri · 221 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Biraz karmasik bir program olacak yaptigim sanirim. Aslinda pek karmasik da sayilmaz. Bu baglamda cikis ve girisler mantikli olabilir. Ama systeminfo bana tam istediklerimi vermezken, wmic tam da istedigim seyleri veriyor.

Tek sorun wmic'i bir degiskene baglayamamak :(

yani system calistirilirken bir degiskene atanmiyor. Sistem komutu hataliymis.

executeShell onerdiler ancak onda da anlayamadigim garip ciktilar var onu cozumleyemedim.
agora #8
Üye Tem 2013 tarihinden beri · 221 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
dlang forumundaki yöntem işe yaradı bile :)

Şimdi düşünürsek bu fonksiyon mükemmel bir fonksiyon :)

Ancak diyelim ki 50-60 kadar wmic değişkeni kontrol ettireceğiz. Hepsini sanırım mutlak suretle tanımlamak gerekiyor. Aman olsun işim görüldü ya o önemli :D

Daha kısa nasıl halledebilirim'e bakacağım.

sanırım

wmic {dizi} get {dizi2}

gibi bir olanak sağlayacağım.

1. dizi os, bios, cpu, networking, desktop vs. gibi ozellikler saklayacak. 2. dizi ise her  ozellik icerisinde var olan parametreleri saklayacak

bunlar caption, serialnumber, pnpdeviceid gibi ozellikler. geriye kalan tek konu bunu dll'e donusturup, c#'a ekleyebilmek. keske D icin WinForm (surukle-birak) seklinde bir arayuz araci olsaydi onu da D ile yapsaydim mecburen C#'a bagli kalacagim ama oncelik bunu nasil C#'a baglarim ve bunu nasil kutuphaneye donustururum olmali. Neyse 2. olan basit ama C#'a ekleme kismi biraz zor sanirim.

Tesekkur ederim Ali hocam. :)
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-20, 01:15:43 (UTC -08:00)