Batchfile in C++

blackboy

Grünschnabel
Hallo.. Ich habe ein kleines Problem =(

also ich habe ein Visual C++ Projekt und möchte jetzt ein Batch file per knopfdruck ausführen lassen.. jetzt startet das Bachtfile aber nur kurz und beendet sich selbständig wieder *seufz*:. hoffe jemand kann mir helfe...

Event. gibt es auch die möglichkeit die aufgabe des Bachtfiles direkt in c++ zu schriben ?!

Danke scho mal im vorraus ...

befehl c++ :

WinExec("convert.bat", SW_SHOW);


Batch File:

ECHO OFF
del files.txt
dir /B h:\ >> files.txt
del convert.vbs
echo Set dMC = CreateObject("dMCScripting.Converter") >> convert.vbs
echo dMC.VolumeNormalize = True >> convert.vbs
echo dMC.DeleteSourceFiles = True >> convert.vbs
echo dMC.ConvertToFolder = True >> convert.vbs
echo dMC.ToFolder = "C:\Audiofiles" >> convert.vbs
for /f %%s IN (files.txt) do echo Call dMC.AddFromToFiles("h:\%%s","%%s_%date%_%time%") >> convert.vbs
echo Call dMC.GoConversion("Mp2",True,False,True,True) >> convert.vbs
call convert.vbs
 
Schreib mal zum Schluss der Batchfile: pause hin. Also so:

ECHO OFF
del files.txt
dir /B h:\ >> files.txt
del convert.vbs
echo Set dMC = CreateObject("dMCScripting.Converter") >> convert.vbs
echo dMC.VolumeNormalize = True >> convert.vbs
echo dMC.DeleteSourceFiles = True >> convert.vbs
echo dMC.ConvertToFolder = True >> convert.vbs
echo dMC.ToFolder = "C:\Audiofiles" >> convert.vbs
for /f %%s IN (files.txt) do echo Call dMC.AddFromToFiles("h:\%%s","%%s_%date%_%time%") >> convert.vbs
echo Call dMC.GoConversion("Mp2",True,False,True,True) >> convert.vbs
call convert.vbs
pause

In C++ müsste es auch gehen (glaub ich), aber da kann ich dir noch nicht weiterhelfen.
 
Hy!

Die Aufgabe des Files lässt sich relativ einfach in C++ nachschreiben:

Code:
DeleteFile( "files.txt");
zum löschen

mit _popen kannst du einen Befehl ausführen, und das Ergebnis in dein Programm holen:
Code:
char   psBuffer[128];
   FILE   *pPipe;

        /* Run DIR so that it writes its output to a pipe. Open this
         * pipe with read text attribute so that we can read it 
         * like a text file. 
         */

   if( (pPipe = _popen( "dir /B h:\\", "rt" )) == NULL )
      exit( 1 );

        /* Read pipe until end of file. */

   while( !feof( pPipe ) )
   {
      if( fgets( psBuffer, 128, pPipe ) != NULL )
         printf( psBuffer );
   }

        /* Close pipe and print return value of pPipe. */

   printf( "\nProcess returned %d\n", _pclose( pPipe ) );
(das ist bis auf den Befehl 1:1 aus der MSDN)
Wenn du den Inhalt des Ordners jedoch in einem Textfile benötigst kannst du "dir /B... >> files.txt" auch mit ShellExecute oder CreateProcess aufrufen (WinExec ist soweit ich weis veraltet)

mit _popen kannst du dann die darauffolgenden Ausgaben von deinem VB-Script auf den Bildschrim bringen (warum machst du nicht gleich alles in C++?)

Hoffe das ich dir helfen konnte (der Code ist zwar nicht getestet, sollte aber funktionieren)
Wenn du noch Fragen hast, einfach posten

mfg
uhu01
 
Danke für die schnellen Antworten;D

also der Sinn dieses Files ist es, alle dateien die im verzeichniss H:\ (mp3 player) liegen in eine liste zu kopieren.. jetzt soll für jedes dieser Files folgende Zeile in ein vbs File geschriben werden.

dMC.AddFromToFiles("h:\%%s","%%s_%date%_%time%")

die %% sind platzhalter für Filename oder Datum und Zeit (siehe unten)..



dMC.AddFromToFiles("h:\<Filename>","<Filename>_<datum>_<Zeit>"

es wäre natürlich schön wenn man dies auch mit c++ realisieren kann. ;D

Danke



uhu01 hat gesagt.:
Hy!

Die Aufgabe des Files lässt sich relativ einfach in C++ nachschreiben:

Code:
DeleteFile( "files.txt");
zum löschen

mit _popen kannst du einen Befehl ausführen, und das Ergebnis in dein Programm holen:
Code:
char psBuffer[128];
FILE *pPipe;
 
/* Run DIR so that it writes its output to a pipe. Open this
* pipe with read text attribute so that we can read it 
* like a text file. 
*/
 
if( (pPipe = _popen( "dir /B h:\\", "rt" )) == NULL )
exit( 1 );
 
/* Read pipe until end of file. */
 
while( !feof( pPipe ) )
{
if( fgets( psBuffer, 128, pPipe ) != NULL )
printf( psBuffer );
}
 
/* Close pipe and print return value of pPipe. */
 
printf( "\nProcess returned %d\n", _pclose( pPipe ) );
(das ist bis auf den Befehl 1:1 aus der MSDN)
Wenn du den Inhalt des Ordners jedoch in einem Textfile benötigst kannst du "dir /B... >> files.txt" auch mit ShellExecute oder CreateProcess aufrufen (WinExec ist soweit ich weis veraltet)

mit _popen kannst du dann die darauffolgenden Ausgaben von deinem VB-Script auf den Bildschrim bringen (warum machst du nicht gleich alles in C++?)

Hoffe das ich dir helfen konnte (der Code ist zwar nicht getestet, sollte aber funktionieren)
Wenn du noch Fragen hast, einfach posten

mfg
uhu01
 
Hy!

Wenn du nur dieses vbs schreiben willst könntest du es so machen:

Code:
#include <windows.h>
#include <iostream>
#include <fstream>
#include <sstream>
#include <iomanip>
using namespace std;

void PrintFolderInhalt( string _folder, string &_time, fstream &_file);

int main( int argc, char* argv[]) {
	fstream ioFile( "test.vbs", ios::out);
	
	SYSTEMTIME stTime;
	GetLocalTime( &stTime);
	stringstream strstrTime;
	strstrTime	<< stTime.wYear 
				<< setw(2) << setfill('0') << stTime.wMonth 
				<< setw(2) << setfill('0') << stTime.wDay 
				<< "_" 
				<< setw(2) << setfill('0') << stTime.wHour 
				<< setw(2) << setfill('0') << stTime.wMinute;
	PrintFolderInhalt( "C:\\test\\", strstrTime.str(), ioFile);
}

void PrintFolderInhalt( string _folder, string &_time, fstream &_file) {
	WIN32_FIND_DATA w32fd;

	HANDLE hFind= FindFirstFile( (_folder + "*.*").c_str(), &w32fd);
	if (hFind == INVALID_HANDLE_VALUE)
		return;

	do {
		if( (string)w32fd.cFileName == "." || (string)w32fd.cFileName == "..")
			continue;
		if( w32fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
			PrintFolderInhalt( _folder + w32fd.cFileName + "\\", _time, _file);
		} else {
			_file << "dMC.AddFromToFiles(\"" << _folder << w32fd.cFileName << "\",\"" << w32fd.cFileName << "_" << _time << "\")" << endl;
		}
	}
	while (FindNextFile(hFind, &w32fd));

	FindClose(hFind);

}

Klarerweise musst (bzw. solltest) du den Ordner nicht Hardcodieren, sondern dem Prog. als Parameter übergeben. Das gleicht solltest du auch mit dem Datum machen, sofern du nicht das aktuelle Datum haben möchtest. Wenn du dein eigenes Datum haben möchtest, einfach per Übergabe an die Funktion, und den Teil mit dem "GetLocalTime" sowie den stringstream löschen. (Den stringstream verwende ich, damit ich das Datum leicht zusammensetzten kann). Solltest du mit Datum das letzte Änderungsdatum o.Ä. gemeint haben kann ich den Code noch nachliefern.
Das erzeugt ein File mit z.B. folgenden Inhalt:
Code:
dMC.AddFromToFiles("C:\test\source\folder1\Kopie von test.txt","Kopie von test.txt_20050329_1911")
dMC.AddFromToFiles("C:\test\source\folder1\test.txt","test.txt_20050329_1911")
dMC.AddFromToFiles("C:\test\source\folder2\Kopie von test.txt","Kopie von test.txt_20050329_1911")
dMC.AddFromToFiles("C:\test\source\folder2\test.txt","test.txt_20050329_1911")
dMC.AddFromToFiles("C:\test\source\test.txt","test.txt_20050329_1911")
Ich glaube so willst du es, oder?
Was macht dein vbs eingentlich?
Solltest du noch Fragen dazu haben, nur raus damit.

mfg
uhu01
 
Ja genau das hab ich gesucht ;D


Daaaaaanakeeeee !


Also das vbs file sagt dem Audiokonverter (dbPowerAmp) welche files er in welches format wandeln soll ...

hätte da noch ne andere Frage..
wie ich sehe bist du ja ziemlich fitt in C++

also ich möchte eine Drop Down Liste mache in Visual c++
mit ca. 5 Rubricken ..
Jetzt möchte ich aber diese Rubriken aus einem Text file lesen, damit man sie anpassen kann ohne den Quellcode des Programms bearbeiten zu müssen...
hast du ne idee

GrEEZzZz
 
Hy!

Ich gehe mal davon aus, das du eine MFC Anwendung meinst.
In diesem Fall musst du eine Membervariable (für das Steuerelement) anlegen, und dann kannst du in OnInitDialog(..) mit der Methode AddString(); neue Elemente einfügen, welche du einfach in OnInitDialog aus deinem Textfile ließt.

mfg
uhu01
 
Zurück