dos komutu sorunu

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
seci20

dos komutu sorunu

Mesaj gönderen seci20 »

ustalarım merhaba daha once bunla ılgılı bır konu acmıstım yenıden acmamım sebebı daha cozum bulamamıs olmam.Normal cmd yazdıgım komut gıbı delphidede sırayla komut gondermek ıstıyorum ama bır turlu olmuyor.Diğer komutu gonderdıgımde bır oncekı ıptal oluyor yanı soyle acıklama yapayım...

sırayla cmd komutları var

1.komut

Kod: Tümünü seç

adb shell
2.komut
sımdı ılk komutta ornegın telefonun ıcıne baglandım ve telefonun ıcındekı bır programı calıstırmam gereklı ama bunu bır turlu basaramıyorum.

örneğin programı çalıştırdım ve onay vermem gereklı yanı 2. bir komutu gırmem gereki ama giremıyorum form donuyor dongude takılı kalıyor.Normal elle yazdığımız komut gıbı devamını getıremıyorum.

resimli olarak acıklamak gereklı ıse.

sımdı normal sekılde sırayla cmdeye su komutları gırdıgım zaman ekranda programın calıstıgını goruyorum komut sıralaması su sekılde.

Kod: Tümünü seç

adb shell

Kod: Tümünü seç

data/local/tmp/firewater
şimdi telefonda programı calıstırdım ve ekranda gordum sımdı programa onay vermem gerekli normal olarak bu onayı cmd ekranına klavye ıle yes yazıyorum ve program onayı alıp calısmaya devam edıyor.ama bunu delphide bir türlü başaramadım normal cmd ekranına yazdıgım gıbı delphide gonderemıyorum.

Yes ekranı
Resim

bu program sadece bir ornek aslında daha bır cok telefonun ıcındekı programları calıstıramıyorum program hep asılı kalıyor ve bır zaman sonra form donuyor.Çalıştırdıgım programların bır parametleri yok yanı ılle calıstırdıktan sonra oraya Yes yazmam yada farklı komutlar gırmem gereklı umarım tam acıklıyabılmısımdır Yardımcı olan ustalarıma sımdıden cok tesekkur ederım...
xxxjedixxx
Üye
Mesajlar: 216
Kayıt: 10 Ara 2013 03:50

Re: dos komutu sorunu

Mesaj gönderen xxxjedixxx »

Merhaba,

Dos komutlarında bu işi "echo" komutu ile yapıyorduk.

Örneğin

del *.* komutunu çalıştırdığınızda onay sorusu gelir ve Y tuşuna bastığınızda silerdi. Y komutunu otomatik girmek için

echo Y|del *.*

yazıldığında soru sormadan dosyalar silinebiliyor.

Yapmak istediğinizi aşağıdaki gibi dener misiniz.

echo Yes|komutunuz
seci20

Re: dos komutu sorunu

Mesaj gönderen seci20 »

xxxjedixxx yazdı:Merhaba,

Dos komutlarında bu işi "echo" komutu ile yapıyorduk.

Örneğin

del *.* komutunu çalıştırdığınızda onay sorusu gelir ve Y tuşuna bastığınızda silerdi. Y komutunu otomatik girmek için

echo Y|del *.*

yazıldığında soru sormadan dosyalar silinebiliyor.

Yapmak istediğinizi aşağıdaki gibi dener misiniz.

echo Yes|komutunuz
hocam cevap verdıgınız ıcın tesekkur ederım ama oda olmadı sanırsam sebebıde su oda aynı delphide oldugu gıbı bır ust komutun bıtmesını beklıyor o yuzden olmuyor.Normal olarak örneğin adb shell yazdıgımızda cmd ekranı bızden komut gırmemızı beklıyor ama delphide bu yada bat dosyasında bu gecerlı degıl
edo
Üye
Mesajlar: 40
Kayıt: 05 Haz 2005 11:12

Re: dos komutu sorunu

Mesaj gönderen edo »

Komutlarınızı peşpeşe göndermemeniz (bir komut bittikten sonra başka bir komutu göndermeniz) ve aynı process bilgisi üzerine devam etmeniz gerekiyor diye düşünüyorum.

Google'da şöyle bir arama yapınca çıkan sonuçlara bakabilirsiniz: https://www.google.com.tr/webhp?sourcei ... o%20finish

Aşağıdaki linkte şöyle bir kod var:
http://stackoverflow.com/questions/1733 ... -completed

Kod: Tümünü seç

procedure ExecuteAndWait(const aCommando: string);
var
  tmpStartupInfo: TStartupInfo;
  tmpProcessInformation: TProcessInformation;
  tmpProgram: String;
begin
  tmpProgram := trim(aCommando);
  FillChar(tmpStartupInfo, SizeOf(tmpStartupInfo), 0);
  with tmpStartupInfo do
  begin
    cb := SizeOf(TStartupInfo);
    wShowWindow := SW_HIDE;
  end;

  if CreateProcess(nil, pchar(tmpProgram), nil, nil, true, CREATE_NO_WINDOW,
    nil, nil, tmpStartupInfo, tmpProcessInformation) then
  begin
    // loop every 10 ms
    while WaitForSingleObject(tmpProcessInformation.hProcess, 10) > 0 do
    begin
      Application.ProcessMessages;
    end;
    CloseHandle(tmpProcessInformation.hProcess);
    CloseHandle(tmpProcessInformation.hThread);
  end
  else
  begin
    RaiseLastOSError;
  end;
end;
Bunu ya da diğer linklerdeki kodlardan birini kendi ihtiyacınıza göre modifiye ederseniz işinize yarayabilir. Biraz deneme/yanılma yapmanız gerekecek sanırım :)

Başarılar şimdiden :bravo:
ertank
Kıdemli Üye
Mesajlar: 1711
Kayıt: 12 Eyl 2015 12:45

Re: dos komutu sorunu

Mesaj gönderen ertank »

seci20 yazdı:ustalarım merhaba daha once bunla ılgılı bır konu acmıstım yenıden acmamım sebebı daha cozum bulamamıs olmam.Normal cmd yazdıgım komut gıbı delphidede sırayla komut gondermek ıstıyorum ama bır turlu olmuyor.Diğer komutu gonderdıgımde bır oncekı ıptal oluyor yanı soyle acıklama yapayım...

sırayla cmd komutları var

1.komut

Kod: Tümünü seç

adb shell
2.komut
sımdı ılk komutta ornegın telefonun ıcıne baglandım ve telefonun ıcındekı bır programı calıstırmam gereklı ama bunu bır turlu basaramıyorum.

örneğin programı çalıştırdım ve onay vermem gereklı yanı 2. bir komutu gırmem gereki ama giremıyorum form donuyor dongude takılı kalıyor.Normal elle yazdığımız komut gıbı devamını getıremıyorum.

resimli olarak acıklamak gereklı ıse.

sımdı normal sekılde sırayla cmdeye su komutları gırdıgım zaman ekranda programın calıstıgını goruyorum komut sıralaması su sekılde.

Kod: Tümünü seç

adb shell

Kod: Tümünü seç

data/local/tmp/firewater
şimdi telefonda programı calıstırdım ve ekranda gordum sımdı programa onay vermem gerekli normal olarak bu onayı cmd ekranına klavye ıle yes yazıyorum ve program onayı alıp calısmaya devam edıyor.ama bunu delphide bir türlü başaramadım normal cmd ekranına yazdıgım gıbı delphide gonderemıyorum.

Yes ekranı
Resim

bu program sadece bir ornek aslında daha bır cok telefonun ıcındekı programları calıstıramıyorum program hep asılı kalıyor ve bır zaman sonra form donuyor.Çalıştırdıgım programların bır parametleri yok yanı ılle calıstırdıktan sonra oraya Yes yazmam yada farklı komutlar gırmem gereklı umarım tam acıklıyabılmısımdır Yardımcı olan ustalarıma sımdıden cok tesekkur ederım...
Merhaba, mevcut Delphi kodunu paylaşmanız mümkün müdür?
seci20

Re: dos komutu sorunu

Mesaj gönderen seci20 »

ertank yazdı:
seci20 yazdı:ustalarım merhaba daha once bunla ılgılı bır konu acmıstım yenıden acmamım sebebı daha cozum bulamamıs olmam.Normal cmd yazdıgım komut gıbı delphidede sırayla komut gondermek ıstıyorum ama bır turlu olmuyor.Diğer komutu gonderdıgımde bır oncekı ıptal oluyor yanı soyle acıklama yapayım...

sırayla cmd komutları var

1.komut

Kod: Tümünü seç

adb shell
2.komut
sımdı ılk komutta ornegın telefonun ıcıne baglandım ve telefonun ıcındekı bır programı calıstırmam gereklı ama bunu bır turlu basaramıyorum.

örneğin programı çalıştırdım ve onay vermem gereklı yanı 2. bir komutu gırmem gereki ama giremıyorum form donuyor dongude takılı kalıyor.Normal elle yazdığımız komut gıbı devamını getıremıyorum.

resimli olarak acıklamak gereklı ıse.

sımdı normal sekılde sırayla cmdeye su komutları gırdıgım zaman ekranda programın calıstıgını goruyorum komut sıralaması su sekılde.

Kod: Tümünü seç

adb shell

Kod: Tümünü seç

data/local/tmp/firewater
şimdi telefonda programı calıstırdım ve ekranda gordum sımdı programa onay vermem gerekli normal olarak bu onayı cmd ekranına klavye ıle yes yazıyorum ve program onayı alıp calısmaya devam edıyor.ama bunu delphide bir türlü başaramadım normal cmd ekranına yazdıgım gıbı delphide gonderemıyorum.

Yes ekranı
Resim

bu program sadece bir ornek aslında daha bır cok telefonun ıcındekı programları calıstıramıyorum program hep asılı kalıyor ve bır zaman sonra form donuyor.Çalıştırdıgım programların bır parametleri yok yanı ılle calıstırdıktan sonra oraya Yes yazmam yada farklı komutlar gırmem gereklı umarım tam acıklıyabılmısımdır Yardımcı olan ustalarıma sımdıden cok tesekkur ederım...
Merhaba, mevcut Delphi kodunu paylaşmanız mümkün müdür?
hocam mevcut bir kod yok yanlız cmd ıcın kullandıgım bir kod var ama dedıgım gıbı bu programın bıtmesını beklıyor normal olarak ikinci bir komutu gonderemıyorum....

Kod: Tümünü seç

function IsWinNT: boolean;
var
  OSV: OSVERSIONINFO;
begin
  OSV.dwOSVersionInfoSize := sizeof(osv);
  GetVersionEx(OSV);
  result := OSV.dwPlatformId = VER_PLATFORM_WIN32_NT;
end;
function cmdxcx(Cmd: string): string;
var
  Buffer: array[0..4096] of Char;
  si: STARTUPINFO;
  sa: SECURITY_ATTRIBUTES;
  sd: SECURITY_DESCRIPTOR;
  pi: PROCESS_INFORMATION;
  newstdin, newstdout, read_stdout, write_stdin: THandle;
  exitcod, bread, avail: Cardinal;
  Str: string;
begin
  Result:= '';
  if IsWinNT then
  begin
    InitializeSecurityDescriptor(@sd, SECURITY_DESCRIPTOR_REVISION);
    SetSecurityDescriptorDacl(@sd, true, nil, false);
    sa.lpSecurityDescriptor := @sd;
  end
  else sa.lpSecurityDescriptor := nil;
  sa.nLength := sizeof(SECURITY_ATTRIBUTES);
  sa.bInheritHandle := TRUE;
  if CreatePipe(newstdin, write_stdin, @sa, 0) then
  begin
    if CreatePipe(read_stdout, newstdout, @sa, 0) then
    begin
      GetStartupInfo(si);
      with si do
      begin
        dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
        wShowWindow := SW_HIDE;
        hStdOutput := newstdout;
        hStdError := newstdout;
        hStdInput := newstdin;
      end;
      Fillchar(Buffer, SizeOf(Buffer), 0);
      GetEnvironmentVariable('COMSPEC', @Buffer, SizeOf(Buffer) - 1);
      StrCat(@Buffer,PChar(' /c ' + Cmd));
      if ara=true then
       form2.AdvProgressBar1.Position:=0;
      if CreateProcess(nil, @Buffer, nil, nil, TRUE, CREATE_NEW_CONSOLE, nil, nil, si, pi) then
      begin
        Str:= #13;
        WriteFile(write_stdin,PansiChar(Str)^,Length(Str),bread,nil);
        repeat
       delay(10);
       if ara=true then
       form2.AdvProgressBar1.Position:=form2.AdvProgressBar1.Position+1;
          PeekNamedPipe(read_stdout, @Buffer, SizeOf(Buffer) - 1, @bread, @avail, nil);
          if bread > 0 then
          begin
            Fillchar(Buffer, SizeOf(Buffer), 0);
            ReadFile(read_stdout, Buffer, bread, bread, nil);
            Result:= Result + String(PansiChar(@Buffer));
          end;
          GetExitCodeProcess(pi.hProcess, exitcod);
        until (exitcod <> STILL_ACTIVE) and (bread = 0);
      end;
      if ara=true then
       form2.AdvProgressBar1.Position:=100;
      CloseHandle(read_stdout);
      CloseHandle(newstdout);
    end;
    CloseHandle(newstdin);
    CloseHandle(write_stdin);
  end;
end;
seci20

Re: dos komutu sorunu

Mesaj gönderen seci20 »

edo yazdı:Komutlarınızı peşpeşe göndermemeniz (bir komut bittikten sonra başka bir komutu göndermeniz) ve aynı process bilgisi üzerine devam etmeniz gerekiyor diye düşünüyorum.

Google'da şöyle bir arama yapınca çıkan sonuçlara bakabilirsiniz: https://www.google.com.tr/webhp?sourcei ... o%20finish

Aşağıdaki linkte şöyle bir kod var:
http://stackoverflow.com/questions/1733 ... -completed

Kod: Tümünü seç

procedure ExecuteAndWait(const aCommando: string);
var
  tmpStartupInfo: TStartupInfo;
  tmpProcessInformation: TProcessInformation;
  tmpProgram: String;
begin
  tmpProgram := trim(aCommando);
  FillChar(tmpStartupInfo, SizeOf(tmpStartupInfo), 0);
  with tmpStartupInfo do
  begin
    cb := SizeOf(TStartupInfo);
    wShowWindow := SW_HIDE;
  end;

  if CreateProcess(nil, pchar(tmpProgram), nil, nil, true, CREATE_NO_WINDOW,
    nil, nil, tmpStartupInfo, tmpProcessInformation) then
  begin
    // loop every 10 ms
    while WaitForSingleObject(tmpProcessInformation.hProcess, 10) > 0 do
    begin
      Application.ProcessMessages;
    end;
    CloseHandle(tmpProcessInformation.hProcess);
    CloseHandle(tmpProcessInformation.hThread);
  end
  else
  begin
    RaiseLastOSError;
  end;
end;
Bunu ya da diğer linklerdeki kodlardan birini kendi ihtiyacınıza göre modifiye ederseniz işinize yarayabilir. Biraz deneme/yanılma yapmanız gerekecek sanırım :)

Başarılar şimdiden :bravo:
hocam cevap verdıgınız ıcın tesekkur ederım lakın burdakı tum kodları denedım burdakılerde aynı sekılde ılk komutun bıtmesını beklıyorlar bır turlu basaramadım modıfıye etmeyıde malasef...
ertank
Kıdemli Üye
Mesajlar: 1711
Kayıt: 12 Eyl 2015 12:45

Re: dos komutu sorunu

Mesaj gönderen ertank »

Ekteki uygulamayı kendinize göre uyarlayabilirsiniz.

Delphi 2007 ve sonrasında çalışır.

Önce start butonunu tıklayıp sonra edit alanına "dir", "chkdsk" gibi komutlar yazıp test edebilirsiniz.

Parametre göndermeniz gereken uygulamalardan gelen spesifik kelimeleri memo alanı içinde kontrol edip istediğiniz parametreyi örnek uygulamayı kullanarak uygulamaya gönderebilirsiniz.

NOT: Sıkıştırılmış dosyayı açmak için WinRar 5.0 ve üzeri gereklidir.
Dosya ekleri
Redirect.rar
(6.59 KiB) 153 kere indirildi
seci20

Re: dos komutu sorunu

Mesaj gönderen seci20 »

ertank yazdı:Ekteki uygulamayı kendinize göre uyarlayabilirsiniz.

Delphi 2007 ve sonrasında çalışır.

Önce start butonunu tıklayıp sonra edit alanına "dir", "chkdsk" gibi komutlar yazıp test edebilirsiniz.

Parametre göndermeniz gereken uygulamalardan gelen spesifik kelimeleri memo alanı içinde kontrol edip istediğiniz parametreyi örnek uygulamayı kullanarak uygulamaya gönderebilirsiniz.

NOT: Sıkıştırılmış dosyayı açmak için WinRar 5.0 ve üzeri gereklidir.
hocam bın kez tesekkur ederım ne desem bılemedım gercekten helal olsun :)
Cevapla