<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Lösungsvorschläge für eine Shell]]></title><description><![CDATA[<p>Hallo, ich habe hier einmal mein Projekt xmd-tools (<a href="http://www.xmd-tools.de.vu" rel="nofollow">www.xmd-tools.de.vu</a>) vorgestellt, alle Befehle befinden sich im Unterordner bin\. Die Shell führt alle Befehle in diesem Ordner aus, jetzt möchte eine Art Umgebungsvariable für auszuführende Befehle/Programme erstellen, damit man auch andere Pfade setzen kann so ist die Shell flexibler und kann auch andere Befehle ausführen.</p>
<p>Beispiel: Die Umgebungsvariable <strong>bin</strong> soll alle Pfade mit einem bestimmten Zeichen z.B. <strong>;</strong> trennen:</p>
<pre><code>C:\xmd-tools\bin;C:\Windows\system32;C:\windows;...
</code></pre>
<p>Hier wird zuerst der eingegebene Befehl im Pfad 1 durchsucht, wenn dieser nicht gefunden oder ausgeführt wegen kann, geht dieser weiter zum 2. Pfad usw...ähnlich wie bei VS2005 mit den Include Pfaden.</p>
<p><strong>Problem:</strong><br />
<strong>1)</strong> Wo würdet ihr so eine Umgebungsvariable erstellen, also wo sollte dieser stehen, eher in der Registry oder als eine Art Config Datei?</p>
<p><strong>2)</strong> Wie kriege ich raus ob der Befehl ausgeführt wurde, damit in den anderen Pfaden weitergesucht wird?<br />
Beispiel: Ich gebe den Befehl <strong>net view</strong> ein, zuerst wird im Pfad: <em>C:\xmd-tools\bin</em> nachgeschaut, doch dieser Befehl befindet sich nicht dort und sucht weiter in <em>C:\Windows\system32</em> dieser wird gefunden und ausgeführt.</p>
<p>Bitte um Tipps</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/168017/lösungsvorschläge-für-eine-shell</link><generator>RSS for Node</generator><lastBuildDate>Wed, 08 Jul 2026 03:39:59 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/168017.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 17 Dec 2006 16:11:46 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Lösungsvorschläge für eine Shell on Sun, 17 Dec 2006 16:11:46 GMT]]></title><description><![CDATA[<p>Hallo, ich habe hier einmal mein Projekt xmd-tools (<a href="http://www.xmd-tools.de.vu" rel="nofollow">www.xmd-tools.de.vu</a>) vorgestellt, alle Befehle befinden sich im Unterordner bin\. Die Shell führt alle Befehle in diesem Ordner aus, jetzt möchte eine Art Umgebungsvariable für auszuführende Befehle/Programme erstellen, damit man auch andere Pfade setzen kann so ist die Shell flexibler und kann auch andere Befehle ausführen.</p>
<p>Beispiel: Die Umgebungsvariable <strong>bin</strong> soll alle Pfade mit einem bestimmten Zeichen z.B. <strong>;</strong> trennen:</p>
<pre><code>C:\xmd-tools\bin;C:\Windows\system32;C:\windows;...
</code></pre>
<p>Hier wird zuerst der eingegebene Befehl im Pfad 1 durchsucht, wenn dieser nicht gefunden oder ausgeführt wegen kann, geht dieser weiter zum 2. Pfad usw...ähnlich wie bei VS2005 mit den Include Pfaden.</p>
<p><strong>Problem:</strong><br />
<strong>1)</strong> Wo würdet ihr so eine Umgebungsvariable erstellen, also wo sollte dieser stehen, eher in der Registry oder als eine Art Config Datei?</p>
<p><strong>2)</strong> Wie kriege ich raus ob der Befehl ausgeführt wurde, damit in den anderen Pfaden weitergesucht wird?<br />
Beispiel: Ich gebe den Befehl <strong>net view</strong> ein, zuerst wird im Pfad: <em>C:\xmd-tools\bin</em> nachgeschaut, doch dieser Befehl befindet sich nicht dort und sucht weiter in <em>C:\Windows\system32</em> dieser wird gefunden und ausgeführt.</p>
<p>Bitte um Tipps</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1193542</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1193542</guid><dc:creator><![CDATA[kernel64]]></dc:creator><pubDate>Sun, 17 Dec 2006 16:11:46 GMT</pubDate></item><item><title><![CDATA[Reply to Lösungsvorschläge für eine Shell on Sun, 17 Dec 2006 16:16:42 GMT]]></title><description><![CDATA[<ol>
<li>
<p>Ich vermute, dem typischen CLI-Sheller ist eine config.ini näher als Registry-Keys.</p>
</li>
<li>
<p>Wenn in diesem Verzeichnis die Datei vorhanden ist, brichst du die Schleife ab.</p>
</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/1193546</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1193546</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 17 Dec 2006 16:16:42 GMT</pubDate></item><item><title><![CDATA[Reply to Lösungsvorschläge für eine Shell on Sun, 17 Dec 2006 16:20:09 GMT]]></title><description><![CDATA[<p>1. Lade einfach ein Shell-Skript, wenn die Shell geöffnet wird. Da kann der Benuter dann sein bin hinpacken. So wird das zumindest unter Unix gemacht</p>
<p>2. Einfach schauen ob die Datei im Verzeichnis vorhanden ist.</p>
<p>btw. findest du das nicht ein bisschen merkwürdig, wenn du das Symbol eines anderen Projektes für dein Projekt klaust, vor allem wenn das eine Projekt Linux ist und du eine Windows-Software schreibst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1193550</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1193550</guid><dc:creator><![CDATA[rüdiger]]></dc:creator><pubDate>Sun, 17 Dec 2006 16:20:09 GMT</pubDate></item><item><title><![CDATA[Reply to Lösungsvorschläge für eine Shell on Sun, 17 Dec 2006 19:54:46 GMT]]></title><description><![CDATA[<p>Danke erstmal für die Tipps</p>
<blockquote>
<p>btw. findest du das nicht ein bisschen merkwürdig, wenn du das Symbol eines anderen Projektes für dein Projekt klaust, vor allem wenn das eine Projekt Linux ist und du eine Windows-Software schreibst?</p>
</blockquote>
<p>Bin auch Linux User, ich wollte mir eine Shell basteln welche unter Windows läuft, deshalb hab ich den Pingu genommen, naja aber ganz zufrieden bin ich damit auch nicht. Wollte eigentlich ein Icon mit einer Prompt, wie kann man Icon selbst erstellen, gibt es hierfür spezielle Programme'?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1193658</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1193658</guid><dc:creator><![CDATA[kernel64]]></dc:creator><pubDate>Sun, 17 Dec 2006 19:54:46 GMT</pubDate></item><item><title><![CDATA[Reply to Lösungsvorschläge für eine Shell on Tue, 19 Dec 2006 17:35:00 GMT]]></title><description><![CDATA[<p>Hallo erstmal, ich habe weiter an dem Problem mit dem Pfaden, so dass der eingegebene Befehl in den jeweiligen Pfaden ausgeführt wird. In einer INI-Datei befindet sich der key <strong>bin</strong>:</p>
<pre><code>[shell]
bin=c:\xmd-tools\bin; c:\windows\system32; c:\windows; ...
</code></pre>
<p>Hierbei wird der eingegebene Befehl zuerst versucht im Pfad <em>c:\xmd-tools\bin</em> auszuführen, wenn nicht soll dieser weiter gehen. Mein Problem ist es jetzt wenn sich der Befehl im ersten Ordner befindet wie breche ich dann die Schleife ab?</p>
<p>Kurzer Einblick bei der Verarbeitung und Ausführung:</p>
<pre><code>Befehl einlesen -&gt; str

 parseComman(str) //Prüft ob Befehl Aliase ist,...
 |
 + - linkCommand(str) // Auslesen der Pfade aus INI -&gt; bin=...  dann weiterleiten
   |
   + - createCommand(path, str) // Pfad und Befehl zusammensetzen
     |
     + - execCommand(str) // Führt den Befehl mit system() aus
</code></pre>
<p>Wie Ihr seht sind mehrere Funktionen erforderlich, da meistens in Schleifen die weiteren Unterfunktionen aufgerufen werden. In der Funktion <strong>linkCommand()</strong> wird die Unterfunktion <strong>createCommand()</strong> aufgerufen:</p>
<pre><code class="language-cpp">for(int i = 0; i &lt; token.size(); i++)
{		
	createCommand(token[i], str);
}
</code></pre>
<p>token[i] ist jeweils der Pfad der in <strong>bin</strong> steht, und str ist der eingegebene Befehl. Wie kann ich jetzt die for schleife beenden wenn der Befehl ausgeführt wurde? Noch ein Problem, wenn der befehl nicht gleich im ersten pfad ist dann wird mehrere male die typische Fehlermeldung von cmd ausgegeben:</p>
<blockquote>
<p>Der Befehl &quot;...&quot; ist entweder falsch geschrieben.....<br />
Der Befehl &quot;...&quot; ist entweder falsch geschrieben.....<br />
....</p>
</blockquote>
<p>Liegt es an der Funktion system()?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1194986</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1194986</guid><dc:creator><![CDATA[kernel64]]></dc:creator><pubDate>Tue, 19 Dec 2006 17:35:00 GMT</pubDate></item><item><title><![CDATA[Reply to Lösungsvorschläge für eine Shell on Wed, 20 Dec 2006 16:11:22 GMT]]></title><description><![CDATA[<p>Kann mir bitte jemand helfen, ich bin ganz wild darauf meine Shell fertig zu erstellen. Ich will versuchen die Befehle mit CreateProcess() zu erstellen welche in der Funktion execCommand() ausgeführt wird. Der Rückgabewert ist der Statuswert ob der Prozess gestartet wurde, hierbei wird dieser Wert an linkCommand() zurückgegeben und dann die For-Schleife beendet.</p>
<p>//<strong>linkCommand()</strong></p>
<pre><code class="language-cpp">for(int i = 0; i &lt; token.size(); i++)
{		
	int stat = createCommand(token[i], str);
	if(stat == 1)
		break;
	else
		cout &lt;&lt; &quot;Nicht gefunden, weiter suchen...&quot; &lt;&lt; endl;
}
</code></pre>
<p>//<strong>execCommand()</strong></p>
<pre><code class="language-cpp">int execCommand(string Command)
{	
	STARTUPINFO siStartupInfo;
	PROCESS_INFORMATION piProcessInfo;
	memset(&amp;siStartupInfo, 0, sizeof(siStartupInfo));
	memset(&amp;piProcessInfo, 0, sizeof(piProcessInfo));
	siStartupInfo.cb = sizeof(siStartupInfo);

	int stat = CreateProcess(NULL, 
					cvt.StringToChar(Command),
					0,
					0,
					TRUE,
					REALTIME_PRIORITY_CLASS,
					0,
					0,
					&amp;siStartupInfo,
					&amp;piProcessInfo);

	CloseHandle(piProcessInfo.hProcess);
	CloseHandle(piProcessInfo.hThread);

	cout &lt;&lt; &quot;STAT:&quot; &lt;&lt; stat &lt;&lt; endl;

	if(stat)
		return true;
	else
		return false; 
}
</code></pre>
<p>Mein einziges Problem ist jetzt, wenn ich z.b. ein windows befehl eingegebe wie z.B. <strong>ipconfig</strong> oder <strong>net view</strong> wird die ausgabe später in der Konsole ausgegeben als mit system(). Ich glaube es liegt daran das CreateProcess() einen neuen Prozess erstellt und in der gleichen Zeit meine Shell wieder die PRompt ausgibt, ich hoffe ihr versteht mich.<br />
Wie kann ich der Shell sagen sie soll so lange warten bie der Prozess etwas ausgibt dann kann sie weiter arbeiten, so wie bei system()</p>
<p>Bitte um Hilfe!!!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1195493</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195493</guid><dc:creator><![CDATA[kernel64]]></dc:creator><pubDate>Wed, 20 Dec 2006 16:11:22 GMT</pubDate></item><item><title><![CDATA[Reply to Lösungsvorschläge für eine Shell on Wed, 20 Dec 2006 17:27:31 GMT]]></title><description><![CDATA[<p>kernel64 schrieb:</p>
<blockquote>
<p>Wie kann ich der Shell sagen sie soll so lange warten bie der Prozess etwas ausgibt dann kann sie weiter arbeiten, so wie bei system()</p>
</blockquote>
<p>'WaitForSingleObject(process_handle, INFINITE);' würde warten, bis der prozess sich beendet hat. nachteil ist halt, das man's nicht abbrechen kann. jedenfalls fällt mir jetzt nicht ein wie...<br />
:xmas2:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1195542</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195542</guid><dc:creator><![CDATA[ten]]></dc:creator><pubDate>Wed, 20 Dec 2006 17:27:31 GMT</pubDate></item><item><title><![CDATA[Reply to Lösungsvorschläge für eine Shell on Wed, 20 Dec 2006 20:20:12 GMT]]></title><description><![CDATA[<p>Danke, es klappt alles prima nur es gibt noch ein Schönheitsfehler, wenn ein Prozess gestartet wird, so wird es auch ausgegeben doch meine Prompt Leiste fehlt.<br />
Also sie fehlt nicht richtig ich muss nur einmal Enter drücken dann ist sie wieder da, aber trotzdem dürfte das nicht passieren, überschreibt CreateProcess() vielleicht STDOUT?</p>
<p>Beispiel: Ich gebe <strong>net view</strong> ein, so sollte es Aussehen:</p>
<pre><code>Eingabe&gt;net view

//Ausgabe

Eingabe&gt;
</code></pre>
<p>Doch mit meinem Code wird die letzte PRompt Zeile wahrscheinlich von CreateProcess() überschrieben:</p>
<pre><code>Eingabe&gt;net view

//Ausgabe

//erst bei ENTER ist die prompt da
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1195665</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195665</guid><dc:creator><![CDATA[kernel64]]></dc:creator><pubDate>Wed, 20 Dec 2006 20:20:12 GMT</pubDate></item></channel></rss>