ShellExecute und Batch-Datei mit Parametern (war: ShellExecute)



  • Hi ich habe ine Prblem mit dem Befel ShellExecute ich will eine .bat Datei mit Attribute was mache ich falsch

    AnsiString Temp1 = "" + Edit2->Text + Edit3->Text + " " + Edit2->Text + "*.msg";
       char *ch = new char[Temp1.Length()+1];
       strcpy(ch, Temp1.c_str());
       ShellExecute(0,"open","\Copy2.bat",ch,0,SW_SHOWNORMAL);
    

    Das ist der Inhalt der .bat Datei wer einen Vorschlag hat wie mann das in C++ losen kann ich bin für vorschläge offen

    @echo off
    C:\Programme\WinRAR\RAR.exe A "%1" "%2"
    del %2
    

    Edit:
    Bitte aussagekräftige Überschriften wählen. Danke!



  • Du brauchst den String nicht zu kopieren, sondern einfach die Methode "c_str()" aufrufen:

    AnsiString Temp1 = Edit2->Text + Edit3->Text + " " + Edit2->Text + "*.msg";
    ShellExecute(0,"open","Copy2.bat",Templ.c_str(),0,SW_SHOWNORMAL);
    

    Außerdem ist "\C" falsch, wenn die Batch-Datei im aktuellen Verzeichnis liegt (dies kann sich im Programm natürlich ändern), dann einfach "Copy.bat" oder auch ".\\Copy.bat" (\ muß maskiert werden!)



  • Hallo

    wenn die Batch-Datei im selben Verzeichnis wie das Programm ist

    ShellExecute(0,"open","Copy2.bat",Templ.c_str(),0,SW_SHOWNORMAL);
    

    bis bald
    akari



  • Man könnte das mit der Batchdatei auch lassen und RAR direkt über ShellExecute aufrufen und dann die Datei mit DeleteFile löschen.



  • hi die .bat Datei wird nicht aufgerufen fileicht fidet ihr einen Fehelr in dem Eingentlichen Code

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      TSearchRec sr;
      int iAttributes = 0;
      StringGrid1->RowCount = 1;
      iAttributes |= faReadOnly * CheckBox1->Checked;
      iAttributes |= faHidden * CheckBox2->Checked;
      iAttributes |= faSysFile * CheckBox3->Checked;
      iAttributes |= faVolumeID * CheckBox4->Checked;
      iAttributes |= faDirectory * CheckBox5->Checked;
      iAttributes |= faArchive * CheckBox6->Checked; 
      iAttributes |= faAnyFile * CheckBox7->Checked; 
      StringGrid1->RowCount = 0;
      int Fehler = 0;
      if(CheckBox8->Checked == true)
      {
      Memo1->Lines->Add("Detaliret Auflistung der Kopierten Darteien\n");
     // Memo1->Lines->Add("\nVom" + DateToStr(Date));
      }
      CheckBox8->Enabled = false;
      DateTimePicker1->Enabled = false;
      DateTimePicker2->Enabled = false;
      Button1->Enabled = false;
      Edit1->Enabled = false;
      Edit2->Enabled = false;
      DriveComboBox1->Enabled = false;
      DriveComboBox2->Enabled = false;
      DirectoryListBox1->Enabled = false;
      DirectoryListBox2->Enabled = false;
      Button2->Enabled = false;
      Button1->Caption = "Dateien werden Kopiert ..." ;
      if (FindFirst(Edit1->Text, iAttributes, sr) == 0)
    
      { 
    
        do 
        {
          if ((sr.Attr & iAttributes) == sr.Attr) 
          { 
    
            StringGrid1->RowCount = StringGrid1->RowCount + 1; 
            StringGrid1->Cells[1][StringGrid1->RowCount-1] = sr.Name; 
            StringGrid1->Cells[2][StringGrid1->RowCount-1] = IntToStr(sr.Size); 
            StringGrid1->Cells[3][StringGrid1->RowCount-1] = sr.Time; 
            TDateTime TempTime = FileDateToDateTime(sr.Time) ;
            if(TempTime >= DateTimePicker1->DateTime-1 && TempTime <= DateTimePicker2->DateTime)
             { 
               StringGrid1->Cells[3][StringGrid1->RowCount-1] = "richtig";
               AnsiString Temp1 = DirectoryListBox1->Directory + Label7->Caption + sr.Name;
               if(sr.Name == "." || sr.Name == "..")
                {
                StringGrid1->Cells[3][StringGrid1->RowCount-1] = "falsch" ;
                }
                else
                {
                 if(!MoveFiles(Temp1, Edit2->Text))
                  {
                  if(CheckBox8->Checked == true)
                  {
                   Memo1->Lines->Add("Die Datei " + sr.Name + " wurde erfolgreich nach " + DirectoryListBox1->Directory + " kopiert\n");
                  }
                  }
                 else
                  {
                    StringGrid1->Cells[3][StringGrid1->RowCount-1] = "Fehler" ;
                    Fehler++;
                  if(CheckBox8->Checked == true)
                  {
                   Memo1->Lines->Add("Die Datei " + sr.Name + " wurde nicht erfolgreich nach " + DirectoryListBox1->Directory + " kopiert\n");
                  }
                  }
                }
    
             }
             else
             {
              StringGrid1->Cells[3][StringGrid1->RowCount-1] = "falsch" ;
             }
    
          }
        } while (FindNext(sr) == 0);
        FindClose(sr);
      if(CheckBox9->Checked == true)
      {
    //   AnsiString Temp1 = Label17->Caption + Label19->Caption + "a df " + Label17->Caption + DirectoryListBox1->Directory + Label7->Caption + Edit3->Text + Label17->Caption + " " + Label17->Caption + Edit2->Text + "*.msg" + Label17->Caption + Label17->Caption;
       AnsiString Temp1 = Edit2->Text + Edit3->Text + " " + Edit2->Text + "*.msg";
       ShellExecute(0,"open","Copy2.bat",Temp1.c_str(),0,SW_SHOWNORMAL);
      }
        if(Fehler != 0)
        {
         ShowMessage("Fehler aufgetreten !");
        }
        else
         {
          ShowMessage("Fertig");
         }
      }
    
      CheckBox8->Enabled = true;
      DateTimePicker1->Enabled = true;
      DateTimePicker2->Enabled = true;
      Button1->Enabled = true;
      Edit1->Enabled = true;
      Edit2->Enabled = true;
      DriveComboBox1->Enabled = true;
      DriveComboBox2->Enabled = true;
      DirectoryListBox1->Enabled = true;
      DirectoryListBox2->Enabled = true;
      Button2->Enabled = true;
      Button1->Caption = "Dateien Kopieren" ;
    


  • Evtl. mußt du dir bei Programmstart das aktuelle Verzeichnis (bzw. das Verzeichnis der EXE) merken und dann vor den Namen der Batch-Datei hängen.

    schau mal nach:
    - Application.ExeName
    - ExtractFilePath(...)


Anmelden zum Antworten