Programm wahlweise mit verschiedene Dateien starten

K

kolchose

Gast
Hallo,

ich habe bevor ich mich hier angemeldet habe schon ein wenig im Forum gesucht aber leider nichts passendes gefunden.

Ich habe ein Programm welches ich wahlweise mit verschiedenen Dateien starten möchte.
Um es genau zu erklären:

Ich habe zwei Dateien xyz.txt welche ich vor Programmstart händisch im Programmordner kopieren muss. Danach kann das Programm gestartet werden.
Die Dateien müssen einen exakten Namen beibehalten.

Habt ihr Anhaltspunkte wie man das realisieren kann?
Schön wäre sowas wie:

*.bat starten, dann eine Auswahl Ver1 oder Ver2 und die batch Datei würde das richtige file in den Programmordner kopieren. Wahrscheinlich müsste man vorher einen löschBefehl setzen oder ein überschreiben der vorhandenen Datei.


Gruß

kolchose
 
kolchose schrieb:
Habt ihr Anhaltspunkte wie man das realisieren kann?
Schön wäre sowas wie:

*.bat starten, dann eine Auswahl Ver1 oder Ver2 und die batch Datei würde das richtige file in den Programmordner kopieren.
Ja, das ist ein Ansatz. Mach das doch so.
 
  • Gefällt mir
Reaktionen: kolchose und M-X
Ist die Extension (*.txt) fix oder kannst du die Extension selbst vergeben bzw. ändern?

Wäre das möglich, könntest du den Extensionen in W10 ein Programm zuordnen.
 
  • Gefällt mir
Reaktionen: kolchose
@zazie die extension is fix. die kann ich nicht ändern.

@BeBur Hast du denn einen Ansatz wo ich anfangen könnte?
Macht man es mit eine batch oder vielleicht einer *.vbs Datei?
 
kolchose schrieb:
Meinst du jetzt eine batch-Datei oder wie im Titel zu lesen ist ein "Programm"? batch erfüllt nämlich nicht mal wirklich die Kriterien für ein echtes Skript, sondern ist eher eine "Stapelverarbeitung", also das aneinanderreihen zahlreicher Kommandos - daher auch der Name.

Wie auch immer, wenn es eine batch sein soll, kannst du das doch einfach über einen Parameter in der Kommandozeile übergeben:

Code:
@echo off
copy %1 %2

Aufruf: batch.bat bla.txt blub.txt
Output: 1 file copied (bla.txt -> blub.txt)

Nach dem Schema kannst du %1 und %2 als Dateipfad/-name verwenden oder als sonstige Parameter nutzen und damit tun was auch immer du möchtest.
 
  • Gefällt mir
Reaktionen: kolchose, M-X und BeBur
Es muss nicht zwingend eine batch sein.

Irgendwas ausführbares, wo man die Wahl hat welches file in den Ordner kopiert wird, damit das eigentliche Program mit der richtigen *.txt startet.
 
Dann kannst du das mit einem Kommandozeilenparameter machen wie oben dargestellt. %1 - %9 sind die mit Leerzeichen getrennten Parameter, die man der batch-Datei mitgibt. Benötigt man Leerzeichen in einem Parameter, wird dieser mit " " umschlossen.


Tiefergehende Hinweise kann man kaum geben, da wir nicht wissen was wie und wo du das eigentliche Programm aufrufen willst, beispielsweise falls es selbst Parameter zum Aufruf benötigt oder dergleichen. Dafür müsstest du ein konkretes Beispiel nennen.
 
  • Gefällt mir
Reaktionen: kolchose
Danke für eure Antworten.

Sorry habe ganz vergessen zu erwähnen daß ich das ganze unter Win10 nutzen möchte.

Das eigentliche Programm selbst braucht keine Parameter. Es ist ein installiertes Programm.
Ich muss zur Zeit händisch im Programm Ordner unter C:\Program Files (x86)\ProgrammXY wahlweise die eine oder die andere *.txt Datei reinkopieren. Danach kann ich das Programm C:\Program Files (x86)\ProgrammXY\ProgrammXY.exe starten.

In dieser *.txt sind Parameter die das eigentliche Programm braucht. Mit diesem Programm mache ich dann unterschiedliche Sachen, abhängig davon welche *.txt sich im Programmordner befindet.

Ich hatte jetzt an was gedacht wo ich zb. irgendwas ausführbares auf dem Desktop habe, wo ich die Auswahl habe welche *.txt kopiert wird damit das Programm mit dem richtigen File startet.

Vielleicht reicht ja auch ein einfaches umbenennen der *.txt Datei. da das Programm nach dem richtigen Dateinamen sucht.

Dann werde ich mich noch ein wenig mehr mit den Kommandozeilen befassen.

Würdet ihr sowas denn mit einer batch machen oder anders lösen?
 
Zuletzt bearbeitet von einem Moderator:
Sorry wenn ich nochmal nachfrage.

Wie muss der Copy Befehl aussehen wenn ich Administrator Berechtigung brauche?
Es ist so wenn ich etwas in diesen Programmordner händisch kopiere, muss ich es nochmal bestätigen.

Wie müsste der Befehl aussehen wenn ich eine Abfrage haben möchte?
Zb.
If 1 kopiere File x aus Ordner x
If 2 kopiere File y aus Ordner y
 
Ich weiß jetzt nicht so recht worauf du hinauswillst. Admin-Rechte, bestätigen und Abfrage.

Administrator
Grundsätzlich ist es so, dass eine batch-Datei, die Aktionen enthält, welche Admin-Rechte benötigen, ihrerseits mit Admin-Rechten gestartet werden sollte. Man kann in einer batch zwar auch mit erweiterten Rechten arbeiten, was effektiv darauf hinausläuft, dass sich die batch selbst nochmal neustartet. aber batch is a bitch und bevor ich mich mit sowas rumschlagen würde, tät ich lieber direkt auf PowerShell und somit ein ordentliches Skript ausweichen.

Bestätigung
Was genau meinst du damit? Die Windows-Achtung-Administrator-Bestätigung?

Abfrage
Da niemand außer dir jetzt weiß was genau du abfragen willst, kann man dazu auch nichts anderes schreiben als einen Link zum Thema IF.
 
  • Gefällt mir
Reaktionen: kolchose
Sorry ich versuche es mal zu erklären.
Ich habe erstmal einen copy Befehl geschrieben der funktioniert auch wenn die eine Datei vom Desktop in einen Ordner auf den Desktop kopiere.
z.B. copy C:\Users\XXX\Desktop\XY.txt C:\Users\XXX\Desktop\test\XY.txt

Passe ich jetzt aber die Pfade so an , dann wird nichts kopiert.
z.B. copy C:\Users\XXX\Desktop\XY.txt C:\Program Files (x86)\test\XY.txt
Mein Gedanke war jetzt, ob es daran liegt, dass wenn ich was in den Program Files (x86) kopieren möchte, immer vorher ein popup erscheint das der Zugriff verweigert wird und ich Administratorberechtigungen angeben muss um es zu kopieren.

Mit Abfrage meinte ich das wenn ich die batch Datei starte, sich z.B. ein Fenster öffnet und ich die Auswahl habe welche Datei dann in den Ordner kopiert wird.

Sorry wenn ich es nicht so genau erklären kann.
 
Ok, so wird ein Schuh draus.

Wie gesagt, eine batch, die Kommandos enthält, welche Admin-Rechte benötigen, muss ihrerseits als Admin ausgeführt werden, weil man ansonsten hässliche Klimmzüge in der batch machen muss. Das kann man entweder über eine Kommandozeile mit Admin-Rechten tun (Start --> cmd --> als Admin ausführen) oder aber man geht über das Kontext-Menü der batch-Datei (oder ggfs den Shortcut) und setzt dort den Haken.


Was die Abfrage im Fenster angeht, kann man wie folgt vorgehen:

Code:
@ECHO off

:INPUTLOOP
CLS
ECHO 1) Datei A kopieren
ECHO 2) Datei B kopieren
ECHO B) eenden
SET /p input=Bitte Auswahl treffen:

IF "%input%"=="1" GOTO:DATEIA
IF "%input%"=="2" GOTO:DATEIB
IF "%input%"=="b" GOTO:ENDE
IF "%input%"=="B" GOTO:ENDE
GOTO:INPUTLOOP

:DATEIA
ECHO ###########################
ECHO Du willst also DateiA
GOTO:MACHDEINDING

:DATEIB
ECHO ###########################
ECHO Du willst also DateiB
GOTO:MACHDEINDING

:MACHDEINDING
ECHO Hier wird ganz viel gemacht
ECHO ###########################
GOTO:EOF

:ENDE
ECHO Dann eben nicht...
GOTO:EOF

Ich habe an der Stelle erstmal bewusst nur mit GOTO gearbeitet, auch wenn ich persönlich mittels CALL eher Funktionen baue, anstatt wie wild zu springen.
Ergänzung ()

Falls es dich dennoch interessiert, eine Funktion sähe so aus:

Code:
CALL:KOPIEREN "QuellDatei" "ZielDatei"
GOTO:EOF

:KOPIEREN %quelle% %ziel%
ECHO copy %1 %2
GOTO:EOF

Wichtig ist dabei, dass man das GOTO:EOF bei der Funktion nicht vergessen darf, weil batch sonst gnadenlos weiterläuft. Die beiden Parameter %quelle% %ziel% erfüllen an dieser Stelle keinen Zweck und können weggelassen werden. Sie dienen lediglich als Hilfestellung welche Parameter die Funktion erwartet. Die Parameter selbst werden innerhalb der Funktion mit %1-%9 abgegriffen (auch wenn oben drüber nur :KOPIEREN steht).

Mit dieser Technik kann man etwas mehr Struktur in das Skript bekommen, weil es sich mehr wie ein normales Skript verhält (ohne wildes GOTO). Zudem wird der redundante Code reduziert, weil beispielsweise die eigentliche copy-Anweisung genau einmal vorhanden ist und je nach Parameter verschiedene Dateien kopiert. Ohne CALL und stattdessen mit GOTO wird es häufig darauf hinauslaufen, dass man in allen parallelen Pfaden plötzlich das Gleiche tut, nur eben mit anderen Dateien.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: kolchose
Super vielen Dank dafür.
Jetzt habe ich erstmal einen Anfang wo ich weiter drauf aufbauen kann.

Genau so habe ich mir das vorgestellt.

Mal schauen das ich es schaffe den Rest am Wochenende noch zu ergänzen.
 
Hallo Raijin

ich hoffe ich darf nochmal auf das Thema zurückkommen.
Wenn ich jetzt die Ordnerstruktur:
C:\Program Files (x86)\AnwendungXY (dort liegt die *.exe des Programms)
C:\Program Files (x86)\AnwendungXY\OrdnerFile1 (dort liegen die jeweiligen *.txt files die kopiert werden müssen)
C:\Program Files (x86)\AnwendungXY\OrdnerFile2 (dort liegen die jeweiligen *.txt files die kopiert werden müssen)

Wenn ich jetzt in die batch Datei unter MACHDEINDING
copy C:\Program Files (x86)\AnwendungXY\OrdnerFile1\XY.txt C:\Program Files (x86)\AnwendungXY\XY.txt
schreibe wird nichts kopiert.
So sieht es jetzt aus:
@ECHO off

:INPUTLOOP
CLS
ECHO 1) Aktion1
ECHO 2) Aktion2
ECHO B) Beenden
SET /p input=Bitte Auswahl treffen:

IF "%input%"=="1" GOTO:DATEIA
IF "%input%"=="2" GOTO:DATEIB
IF "%input%"=="b" GOTO:ENDE
IF "%input%"=="B" GOTO:ENDE
GOTO:INPUTLOOP

:DATEIA
ECHO ###########################
ECHO Du willst also DateiA
GOTO:MACHDEINDING1

:DATEIB
ECHO ###########################
ECHO Du willst also DateiB
GOTO:MACHDEINDING2

:MACHDEINDING1
ECHO
ECHO ###########################
copy C:\Program Files (x86)\AnwendungXY\OrdnerFile1\XY.txt C:\Program Files (x86)\AnwendungXY\XY.txt
GOTO:EOF

:MACHDEINDING2
ECHO
ECHO ###########################
copy C:\Program Files (x86)\AnwendungXY\OrdnerFile2\XY.txt C:\Program Files (x86)\AnwendungXY\XY.txt
GOTO:EOF

:ENDE
ECHO Dann eben nicht...
GOTO:EOF

Die jeweilige XY.txt haben den gleichen Namen und müssten dann im Programm Ordner überschrieben werden.

Ich denke irgendwo ist noch ein Fehler da nichts kopiert wird.
 
Du Anführungszeichen setzen wenn du copy mit Leerzeichen im Pfad nutzt: https://docs.microsoft.com/de-de/tr.../filenames-with-spaces-require-quotation-mark

Habs gerade getestet, bei mir klappt es. Du musst bei ziel pfad im copy natürlich das XY.txt weglassen du kopierst ja in ein Verzeichnis.

Das hier klappt bei mir:

Code:
@ECHO off

:INPUTLOOP
CLS
ECHO 1) Aktion1
ECHO 2) Aktion2
ECHO B) Beenden
SET /p input=Bitte Auswahl treffen:

IF "%input%"=="1" GOTO:DATEIA
IF "%input%"=="2" GOTO:DATEIB
IF "%input%"=="b" GOTO:ENDE
IF "%input%"=="B" GOTO:ENDE
GOTO:INPUTLOOP

:DATEIA
ECHO ###########################
ECHO Du willst also DateiA
GOTO:MACHDEINDING1

:DATEIB
ECHO ###########################
ECHO Du willst also DateiB
GOTO:MACHDEINDING2

:MACHDEINDING1
ECHO
ECHO ###########################
copy "F:\S1 1\test.txt" "F:\T1 1"
GOTO:EOF

:MACHDEINDING2
ECHO
ECHO ###########################
copy "F:\S2 2\test.txt" "F:\T1 1"
GOTO:EOF

:ENDE
ECHO Dann eben nicht...
GOTO:EOF
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: kolchose und Raijin
Genau. Pfadangaben mit Leerzeichen müssen bzw. sollten immer mit "" eingeschlossen werden, weil sonst das Leerzeichen im Pfad als Trennzeichen zwischen den Parametern erkannt wird.

Im Übrigen ist es wenig sinnvoll, wenn du gleich 2x MACHDEINDING machst. Sinn des Beispiels war, dass durch die Auswahl der Datei entweder der Pfad "DATEIA" oder der Pfad "DATEIB" genommen wird - hier finden die dateispezifischen Dinge statt wie das Umkopieren - und beide Pfade werden dann im gemeinsamen Block "MACHDEINDING" fortgesetzt. Da in deinem Beispiel die beiden Ziel-Dateien identische Dateinamen haben, könnte der Programmaufruf bei MACHDEINDING daher universell sein und stets XY.txt nehmen und die Unterscheidung welche XY.txt es nun ist, erfolgt in den beiden DATEI-Blöcken nebst copy in den Anwendungsordner.

Wenn du beim copy die Abfrage zum Überschreiben unterdrücken willst, kannst du copy im übrigen /Y als Schalter mitgeben, dann wird immer überschrieben, ohne wenn und aber.

Das XY.txt im copy-Ziel kann theoretisch bleiben, ist aber rein optional. In der Regel hängt man den Dateinamen am Ziel nur an, wenn man die Datei beim Kopieren umbenennen möchte. Ansonsten ist es ausreichend beim Ziel den Ordnerpfad anzugeben, aber man darf das abschließende \ nicht vergessen. Sonst fragt copy nämlich nach ob das Ziel eine Datei (ohne Endung) oder ein Ordner ist. Mit ziel\ ist eindeutig definiert, dass es sich um einen Ordner handelt und copy wird die XY.txt von der Quelle 1:1 in diesen Ordner kopieren.
 
Sorry für meine Unwissenheit. Ich habe es mir ehrlich gesagt etwas leichter vorgestellt. Wenn ich die batch starte, dann meine Auswahl 1 oder 2 tätige geht das Fenster zu. Nichts wird kopiert und es gibt keine Fehlermeldung.
Ich habe auch mal andere Pfade probiert.
 
Führe die Batch erstmal direkt in der Eingabeaufforderung aus und nicht per Doppelklick.

Start --> cmd
--> pushd vollständigerordnerpfadzurbatch
--> batch.bat
 
  • Gefällt mir
Reaktionen: kolchose
Pack zum Test mal einfach eine Datei bla.txt direkt in den Ordner wo die Batch liegt und mach in der batch nur

copy "bla.txt" "bla2.txt"
 
  • Gefällt mir
Reaktionen: kolchose
Zurück
Oben