WinFuture-Forum.de: Batch Hilfe gesucht - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
  • 2 Seiten +
  • 1
  • 2

Batch Hilfe gesucht


#1 Mitglied ist offline   Klena 

  • Gruppe: Mitglieder
  • Beiträge: 10
  • Beigetreten: 16. April 15
  • Reputation: 0
  • Geschlecht:Weiblich

geschrieben 16. April 2015 - 20:49

Hallo Leute,

bevor ich mit meinem Problem anfange hier mal eine kurze Situationsbeschreibung, was ich machen will.


Es geht darum, dass ich mir einen Switcher für ein Mod (Edain Mod) bauen will. Ziel ist es zwei Spielordner mit fast dem selben Inhalt umzubenennen. Wenn man die Batch startet soll als erstes gewählt werden, welche Version man haben möchte "EM 3.8.1" oder "EM 4.0". Dann wird geschaut, ob der Installationsordner von dem Spiel existiert und ob der Name des Ordners "Aufstieg des Hexenkönigs" entspricht, wenn ja, alles gut und er springt zum Ende, wenn nein:

Soll der Ordner "Aufstieg des Hexenkönigs" in "Aufstieg des Hexenkönigs 1" umbenannt werden und "Aufstieg des Hexenkönigs 2" in "Aufstieg des Hexenkönigs".

Da in meiner Batch die Ordnerpfade vom User in eine Variable gespeichert werden und somit auch die Laufwerksbuchstaben und Überordner anders sein können, kann ich die Variablen leider nicht vordefinieren und dann abändern.

Gibt es eine Möglichkeit solch eine Variable auszulesen und dann in den Überordner zu springen? Oder kann ich sie direkt abändern?

Hier mal mein Codefetzen. Hoffe ich konnte es einigermaßen verständlich erklären. Nicht wundern bisher arbeite ich nur an der 1. Eingabe und noch nicht an Fall 2 (Edain Mod 4.0) bzw. an der äußerlichen Form.

Ich hoffe ihr könnt mir helfen :)

Einen schönen Abend noch

Klena

echo ------------------------------------
@cls
@pause
echo "Bitte eingeben, was du spielen willst. 1 für Edain 3.8.1, 2 für Edain 4.0"
@ set /p "temp="

if temp == "1" echo Bitte Edain 3.8.1 Installationsordner angeben!
@ set /p "Edain3="
@ if (exist "%Edain3%" goto namecheck)

:namecheck
if ("%Edain3%"=="Aufstieg des Hexenkönigs" echo ja) 
else (goto umbenennen)
pause

:umbenennen
cd "%Edain3%"

? \\Überordner zum vorherigen Umbennenen gesucht
ren "Aufstieg des Hexenkönigs" "Aufstieg des Hexenkönigs 1"

ren "%Edain3%" "Aufstieg des Hexenkönigs"
goto end



else echo Bitte Edain 4.0 Installationsordner angeben !
@ set /p "Edain4="
echo -----------------------
cls
pause
cls
echo -----------------------

:end

Dieser Beitrag wurde von Klena bearbeitet: 16. April 2015 - 20:51

0

Anzeige



#2 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 8.895
  • Beigetreten: 20. Juli 07
  • Reputation: 1.126
  • Geschlecht:Männlich
  • Wohnort:Zuhause
  • Interessen:Ja

geschrieben 16. April 2015 - 21:51

Variable auslesen? Überordner springen? :unsure: Ich schätze, ich steh grad ganz böse auf dem Schlauch aber... was genau meinst Du?

- Ein '@echo off' am Anfang der Batchdatei erspart Dir jedes weitere @ am Zeilenanfang.
- Bitte nicht %temp% / %tmp% überschreiben, das sind Systemvariablen.
- Du könntest statt 'rename' auch 'move' verwenden. Ist unter Umständen die bessere Option. Insbesondere dann, wenn in den Variablen absolute Pfade stecken.

Ansonsten sieht das noch ein bissel redundant aus. Du möchtest ja eigentlich für beide Fälle mehr oder weniger genau dasselbe tun. Daher wäre es meines Erachtens sinnvoller, wenn Du eine Art Standardroutine implementierst, die anhand von Übergabeparametern das Entsprechende tut.

Also in der einfachsten Form:
@echo off
choice /c 34 /m "Welche Version?"

IF ERRORLEVEL 2 CALL umbenennen.bat <Parameter für v4>
IF ERRORLEVEL 1 CALL umbenennen.bat <Parameter für v3>
GOTO End
echo Ungültige Eingabe
:End


"If you give a man a fish he is hungry again in an hour. If you teach him to catch a fish you do him a good turn."-- Anne Isabella Thackeray Ritchie

Eingefügtes Bild
Eingefügtes Bild
0

#3 Mitglied ist offline   Klena 

  • Gruppe: Mitglieder
  • Beiträge: 10
  • Beigetreten: 16. April 15
  • Reputation: 0
  • Geschlecht:Weiblich

geschrieben 17. April 2015 - 05:46

Danke erstmal für die schnelle Antwort.

Nun stell dir 2 Ordner vor (Test und Test 2), die irgendwo auf der Platte/dem USB Stick/andere Partition etc. liegen. Also pro Nutzer woanders.

Jetzt möchte ich ohne Datenverlust beide Ordner umbenennen. Denn nur wenn der Ordner "Test" (ohne Ziffer) heißt wird er vom Spiel erkannt.

Jetzt ist es ja so, dass wenn jemand v3.8.1 haben möchte, die Daten von dieser Version aber im Ordner "Test 2" hat, die Batch vorher ja den "Test" Ordner vorher umbenennen muss. Sonst wären die Daten ja weg.

Verständlicher?

Den Pfad hatte ich bei mir ja in einer Variable abgespeichert. Deswegen die Frage, ob dann wenn der letzte Fall Eintritt, ich irgendwie den Pfad abändern kann, bspw. liegen die Daten von Version 3.8.1 auf "G:\Spiele\Test 2". Wie kann ich vor dem umbenennen im "Test" den eigentlichen "Test" Ordner in "Test 1" umbenennen?
0

#4 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 8.895
  • Beigetreten: 20. Juli 07
  • Reputation: 1.126
  • Geschlecht:Männlich
  • Wohnort:Zuhause
  • Interessen:Ja

geschrieben 17. April 2015 - 06:25

Also gibt es pro Installation zwei Profilordner, die zwar gleich heißen müssen, aber untereinander nicht ausgetauscht werden können/sollen?

Was für eine Plattform ist denn das? Vista oder später?

Falls ja, wäre es am Einfachsten, wenn Du das mit Junctions machst. Heißt im Klartext: Du hast zwei Ordner Profildaten-3.8 und Profildaten-4.0 (oder anderweitig bezeichnet). Dann erstellst Du einfach auf Basis der Benutzerauswahl (aus dem Script) eine symbolische Verknüpfung mit dem "richtigen" Namen auf den zugehörigen Ordner, wo die eigentlichen Daten liegen.

Dann mußt Du nichts Wesentliches löschen oder umbenennen oder verschieben. Stattdessen würde das systematisch so ablaufen:

1. Script initialisieren (Variablen setzen usw).
2. Benutzer nach Meinung befragen (via
choice
) und Antwort anschauen.
3. Antwort gültig: Junction entfernen (via
fsutil reparsepoint delete PFAD
); weiter mit 5.
4. Antwort ungültig: Fehlermeldung + Ende.
5. Neue Junction erstellen mit
mklink /J "PFAD_ZUM_NEUEN_NAMEN" "PFAD_ZUM_ALTEN_NAMEN"
.
6. Fertig.

Für den Fall, daß da noch XP involviert ist: Da gibt es den mklink-Befehl noch nicht (und wie's mit den Möglichkeiten von fsutil steht, bin ich grad überfragt). Hier müßtest Du dann irgendwie die beiden Ordner eindeutig ausweisen; am Besten geht das über eine identifizierende, eindeutige Datei darin (da der Ordner ja immer mal umbenannt wird, eignet sich dessen Name nicht dazu). Ob das eine Datei namens VERSION ist, wo was Eindeutiges drinsteht, oder ob sie einfach "3.8" bzw "4.0" oder sonstwie heißt, ist egal; wichtig ist nur, daß Du darauf prüfen kannst. Mit (beispielsweise)
IF EXIST PFAD\v3.8 GOTO V_3_8
geht das vergleichsweise einfach.

Dieser Beitrag wurde von RalphS bearbeitet: 17. April 2015 - 06:26

"If you give a man a fish he is hungry again in an hour. If you teach him to catch a fish you do him a good turn."-- Anne Isabella Thackeray Ritchie

Eingefügtes Bild
Eingefügtes Bild
0

#5 Mitglied ist offline   Klena 

  • Gruppe: Mitglieder
  • Beiträge: 10
  • Beigetreten: 16. April 15
  • Reputation: 0
  • Geschlecht:Weiblich

geschrieben 17. April 2015 - 06:29

Also um genau zu sein geht es um Windows 7.

Leider bin ich, was Batch Dateien angeht, nicht ganz so gut im Thema.
Das war oben meine erste "richtige" Batch Datei.

Aber deine Idee ist gar nicht mal so schlecht... Müsste mich da wohl erst nochmal einarbeiten

Aber wie meinst du diese Zeile:

3. Antwort gültig: Junction entfernen (via
fsutil reparsepoint delete PFAD


Warum die Junction löschen?

Und bin ich bei Junctions nicht wieder bei dem Problem, den Pfad auszulesen?
Ich mein, wenn das bei mir das Laufwerk "G:\Test" ist und bei Dir bspw. "J:\Sonstiges\Test 3" dann müsste ich doch, um eine logische Verknüpfung zu erstellen, wissen, welches Laufwerk / welcher Ordner es ist um dahin dann zu zeigen. Sprich ich müsste die Variable doch dann vorher "auswerten" und ggf. kürzen, oder?

Jetzt stehe ich scheinbar auf dem Schlauch ;)

Dieser Beitrag wurde von Klena bearbeitet: 17. April 2015 - 08:38

0

#6 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 8.895
  • Beigetreten: 20. Juli 07
  • Reputation: 1.126
  • Geschlecht:Männlich
  • Wohnort:Zuhause
  • Interessen:Ja

geschrieben 17. April 2015 - 15:00

Die alte Verknüpfung muß gelöscht werden, damit eine neue unter demselben Namen erstellt werden kann. :)

Wenn die Pfade zu dem/n Ordner(n) nicht bekannt sind, müßten sie der Batchdatei als Parameter übergeben werden. Das obliegt dann demjenigen, der sie ausführt. Alternativ müßtest Du die Batchdatei die gesamte Verzeichnisstruktur durchsuchen lassen... wovon ich dringend abrate, weil das potentiell Ewigkeiten dauert, und vor allem auch fehleranfällig ist (was, wenn das Script den falschen Ordner identifiziert?)

- Parameter findest Du in den Variablen %1... %9, so wie sie in der Kommandozeile auftauchen (%1 = erster Parameter usw).

- Variablen findest Du in %VARIABLENNAME%, wenn Du sie mit SET VARIABLENNAME=... deklariert hast.

- Zu bearbeiten gehen Variablen durchaus auch. Schau dazu auf der Kommandozeile unter
help for
und
help set
nach. Insbesondere wirst Du
%~PARAMETER
für die Zuweisung benötigen; die Tilde (ohne weiteren Modifikator) entfernt eventuell vorhandene Anführungszeichen aus dem Parameter, die aber immer dann vorhanden sein müssen, wenn da Leerzeichen im übergebenen Pfad waren. Mit
set PFAD=%~1
bekommst Du also einen normalisierten Pfad in der Variable Pfad, der im ersten Parameter übergeben wurde.

Dieser Beitrag wurde von RalphS bearbeitet: 17. April 2015 - 15:01

"If you give a man a fish he is hungry again in an hour. If you teach him to catch a fish you do him a good turn."-- Anne Isabella Thackeray Ritchie

Eingefügtes Bild
Eingefügtes Bild
0

#7 Mitglied ist offline   Klena 

  • Gruppe: Mitglieder
  • Beiträge: 10
  • Beigetreten: 16. April 15
  • Reputation: 0
  • Geschlecht:Weiblich

geschrieben 17. April 2015 - 16:33

Hab mich heute mal etwas mehr damit beschäftigt und ich muss sagen so langsam komme ich weiter... Hab nur ein Problem: Warum nimmt er bei mir unter :loop nicht mehr den Parent Folder so wie bei :folderup?


Hier mein Codeschnipsel:
(Nicht wundern, die Stringsuche sucht noch nach Test)

 
 
echo "Bitte Edain 4.0 Installationsordner angeben"
set /p "Edain4="
 
 
choice /c 34 /m "Welche Version willst du starten?"
 
IF ERRORLEVEL 1 set x=%Edain3% && set c=1
IF ErrorLEVEL 2 set x=%Edain4% && set c=2
IF exist "%x%" goto :namecheck
 
 
:namecheck
echo "Dein Verzeichnis: %x%"
echo "%x%"|findstr xyz/> "Test"> tempfindoutput.txt
set /p FINDOUTPUT= < tempfindoutput.txt
IF "%FINDOUTPUT%"=="Test" echo "Alles gut" && del tempfindoutput.txt && goto :checkfolder) else (del tempfindoutput.txt && goto :folderup)
pause


:folderup
for /d %%a in ("%x%") do set var=%%~dpa
echo Das neue Verzeichnis ist: %var% && pause
echo "%var%"|findstr /r "Test"> tempfindoutput.txt
echo findstr /i "Test" tempfindoutput.txt>NUL && echo Schleifenstart && del tempfindoutput.txt && goto :loop
if errorlevel 1 goto :checkfolder 
goto :folderup 
<set /p FINDOUTPUT= < tempfindoutput.txt>
<IF "%FINDOUTPUT%"=="Test" goto :folderup) else (goto :checkfolder)>
pause

:loop

echo %var%
for /d %%a in ("%var%") do set =%%~dpa
echo %var% && pause
echo "%var%"|findstr /r "Test"> tempfindoutput.txt>NUL
if "%FINDOUTPUT%"=="Test" goto :loop
if errorlevel 1 goto :checkfolder


:checkfolder
	set %var%=%~1
	echo %var%
	if exist "Test 1" ren "Test" "Test2" && ren "Test 1" "Test")
	if not exist "Test1" ren "Test" "Test 1" && re "Test 2" "Test" && echo "Bad" && pause
goto :end

 
:end
echo "Zum Beenden"
pause



Dieser Beitrag wurde von Klena bearbeitet: 17. April 2015 - 19:16

0

#8 _d4rkn3ss4ev3r_

  • Gruppe: Gäste

geschrieben 18. April 2015 - 06:38

IF exist "%x%" goto :namecheck

Besser wäre
if [b]not[/b] exist goto :problem

Denn selbst wenn das Verzeichnis nicht existiert abarbeitet die Batch ja den Code weiter ab und :namecheck kommt schon als nächstes.

Du kannst dir das ganze in Datei schreiben, auslesen + löschen sparen.
echo "%x%"|findstr xyz/> "Test" >nul
if not errorlevel 1 echo Alles gut & del tempfindoutput.txt & goto :checkfolder) else (del tempfindoutput.txt & goto :folderup)


Das pause bei :namecheck kann weg. Du hast ja vorher alles geprüft und gehst je nachdem zu einer anderen Sprungmarke.
Das selbe bei :folderup
Und bei :checkfolder ist das nächste eh :end - ob du da jetzt mittels goto hingehst oder nicht.
0

#9 Mitglied ist offline   Klena 

  • Gruppe: Mitglieder
  • Beiträge: 10
  • Beigetreten: 16. April 15
  • Reputation: 0
  • Geschlecht:Weiblich

geschrieben 18. April 2015 - 08:03

Naja die text datei ist nur für mich als Test. Werde nachher meinen Code hier noch mal reinstellen. Fehlt nur noch eine Fallbearbeitung kann man sagen ;)

Also, ich habe das etwas bearbeitet, das renamen ist noch nicht drin.
Wie bekomme ich bei
set /p "Edain3="
den Ordnerpfad mit Leerzeichen eingegeben? Wenn ich bspw. eingebe F:\Temp\Aufstieg des Hexenkönigs kommt immer
"Der Befehl des kann nicht gefunden werden usw"


Jemand eine Idee?

Codeschnipsel:

@echo off

:startup
echo "Bitte Ordner VOR Aufstieg des Hexenkönigs angeben"
set /p "folder="

choice /c 34 /m "Welche Version willst du starten?" 
IF ERRORLEVEL 1 echo "Wo liegt die Version 3.8.1?" && set "Edain3=%~1" && set/P "Edain3=" && set "c=1"  
IF ErrorLEVEL 2 echo "Wo liegt die Version 4.0?" && set "c=2" && set/p "Edain4="
goto :global

:global
IF %c%==1 set variable=%Edain3%
IF %c%==2 set variable=%Edain4%
goto :checkforfile

:checkforfile
if %c%==1 if exist %variable%\edainmodstarter.exe pause && echo "Edain Mod 3 gefunden" && echo "Weiter mit:" && pause && goto :varset
if %c%==1 if not exist %variable%\edainmodstarter.exe echo "Edain Mod 3 Ordner nicht gefunden" && goto :varset
if %c%==2 if exist %variable%\edain_mod_launcher.exe echo "Edain Mod 4 gefunden" && echo "Weiter mit:" && pause && goto :varset
if %c%==2 if exist %variable%\edain_mod_launcher.exe echo "Edain Mod 4 Ordner nicht gefunden" && goto :varset

:varset
for /F "tokens=3 delims='%folder%\'" %%i in ("%variable%") do set string=%%i
goto :foldercheck

:foldercheck
set "rend=Aufstieg des Hexenkönigs"
echo "%rend:~-3%" 
"igs" 

echo IF %c%==1 IF "%rend:~-3%"=="%string:~-3%" echo "Alles gut" && pause && goto :end

<IF %c%==1 if %variable%|findstr "1" echo "Muss umbenannt werden" && pause) else (echo "Edain Mod 3 bereits aktiviert" && goto :end)>
<IF %c%==2 if %variable%|findstr "2" echo "Muss umbenannt werden" && pause) else (echo "Edain Mod 3 bereits aktiviert" && goto :end)>

:end
echo "Zum Beenden:"
pause

Dieser Beitrag wurde von Urne bearbeitet: 19. April 2015 - 00:13
Änderungsgrund: Beiträge verbunden. Urne

0

#10 Mitglied ist offline   Sturmovik 

  • Gruppe: aktive Mitglieder
  • Beiträge: 3.776
  • Beigetreten: 10. Januar 08
  • Reputation: 445
  • Geschlecht:unbekannt
  • Wohnort:In Reichweite der Kaffeemaschine
  • Interessen:IT, Luftfahrt, historische Technik

geschrieben 18. April 2015 - 20:47

Anführungszeichen drum.

Aber ich frag mich schon die Ganze Zeit, wieso du den Pfad nicht fest im Script hinterlegst, anstatt bei jeder Ausführung manuell beide Pfade einzutippen. Mich tät das ja tierisch nerven ;)
«Geschichte wiederholt sich nicht, aber sie reimt sich» (Mark Twain)

Unix won't hold your hand. You wanna shoot your foot, Unix reliably delivers the shot.

True Cloudstorage
0

#11 Mitglied ist offline   Klena 

  • Gruppe: Mitglieder
  • Beiträge: 10
  • Beigetreten: 16. April 15
  • Reputation: 0
  • Geschlecht:Weiblich

geschrieben 18. April 2015 - 23:14

Ich habe doch Anführungszeichen drum, aber er macht das nicht. Könntest du nochmal posten was du an
set /p "Edain3="
ändern würdest?

Und warum ich das nicht händisch eingebe: soll ein vom User unabhängiges Script werden deswegen die Variable.

Dieser Beitrag wurde von Klena bearbeitet: 18. April 2015 - 23:19

0

#12 Mitglied ist offline   DeLuXXFREAK 

  • Gruppe: Mitglieder
  • Beiträge: 1
  • Beigetreten: 19. April 15
  • Reputation: 0

geschrieben 19. April 2015 - 05:10

Beitrag anzeigenZitat (Klena: 18. April 2015 - 23:14)

Und warum ich das nicht händisch eingebe: soll ein vom User unabhängiges Script werden deswegen die Variable.


Warum speicherst du die Pfad Variable dann nicht in einer Text Datei?

Dann könnte deine Batch beim nächsten Start die Text Datein einfach einlesen und der User müsste nur 1 mal die Pfade eingeben, oder ändern sich die Pfade öfters?

Dieser Beitrag wurde von DeLuXXFREAK bearbeitet: 19. April 2015 - 05:11

0

#13 Mitglied ist offline   Klena 

  • Gruppe: Mitglieder
  • Beiträge: 10
  • Beigetreten: 16. April 15
  • Reputation: 0
  • Geschlecht:Weiblich

geschrieben 19. April 2015 - 10:05

Nein aber das wollte ich einbauen wenn das grobe Gerüst erstmal steht. Hast du denn eine Idee, warum er aber bei mir Leerzeichen nicht annimmt? Muss ich um
 set /p "Edain3=" 
noch ein Anführungszeichen setzen? Also so?
  set /p ""Edain3=""

Dieser Beitrag wurde von Klena bearbeitet: 19. April 2015 - 10:07

0

#14 Mitglied ist offline   Sturmovik 

  • Gruppe: aktive Mitglieder
  • Beiträge: 3.776
  • Beigetreten: 10. Januar 08
  • Reputation: 445
  • Geschlecht:unbekannt
  • Wohnort:In Reichweite der Kaffeemaschine
  • Interessen:IT, Luftfahrt, historische Technik

geschrieben 19. April 2015 - 10:31

Nee, das was du eingibst, muss in Anführungszeichen sein: "C:\Pfad\zu\komisches Programm\"
Sonst erkennt die Shell dass als Pfad bis zum Leerzeichen und das nach dem Leerzeichen als Kommando, welches es nicht gibt.



je mehr ich mich mit CMD-Scripten beschäftige, desto mehr bin ich froh, andere Scriptsprachen zu nutzen.
«Geschichte wiederholt sich nicht, aber sie reimt sich» (Mark Twain)

Unix won't hold your hand. You wanna shoot your foot, Unix reliably delivers the shot.

True Cloudstorage
0

#15 Mitglied ist offline   Klena 

  • Gruppe: Mitglieder
  • Beiträge: 10
  • Beigetreten: 16. April 15
  • Reputation: 0
  • Geschlecht:Weiblich

geschrieben 19. April 2015 - 11:59

Wie kann ich das denn reinprogrammieren dass die Anführungszeichen automatisch gesetzt werden?
0

Thema verteilen:


  • 2 Seiten +
  • 1
  • 2

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0