angrydad
Goto Top

Txt datei veränden - "steuerung" für VirtualBox

Hallo zusammen!

Möchte eine .bat schreiben mit der ich meine VM´s steuern kann.
Hab es schon geschafft die Liste der verfügbaren vm´s in eine .txt
zu bekommen.

Das sieht dann so aus:

"OwnCloud"
"Mail"
"Webs"
"SeaNAS"
"Seafile"
"Insurgency"
"UB-0001"
"TL-0002"
usw..

Nun möchte ich das die Einträge Nummerriert angezeit werden also müsste die .txt dann so aussehen:

1 = "OwnCloud"
2 = "Mail"
3 = "Webs"
4 = "SeaNAS"
5 = "Seafile"
6 = "Insurgency"
7 = "UB-0001"
8 = "TL-0002"
usw..

Weiters müssten dann alle Einträge in der Form "Owncloud" ohne " und ohne 1 = einer Variablen übergeben werden

Also

VM1 = Owncloud
VM2 = Mail

usw...

Ziel soll es sein das der Benutzer mittels Tasten von 1 bis ... die zu ändernde VM auswählen kann.

Weitere Herausforderung - Die Anzahl der VM´s Bleibt nicht gleich!


Besten dank schonmal!

Mfg.
Markus

Content-ID: 270431

Url: https://administrator.de/contentid/270431

Ausgedruckt am: 24.11.2024 um 09:11 Uhr

114757
Lösung 114757 27.04.2015, aktualisiert am 28.04.2015 um 11:37:44 Uhr
Goto Top
Moin Markus,
z.B. direkt als Auswahlmenü ohne Änderung der Textdatei ...
@echo off & setlocal enabledelayedexpansion
Set "vmfile=c:\vms.txt"  
Set /a cnt=0
echo Bitte VM selektieren
echo.
for /f "usebackq delims=" %%a in ("%vmfile%") DO @(  
    set /a cnt+=1
    set "VM!cnt!=%%~a"  
    echo [!cnt!] - %%~a
)
echo.
set /p answer=Ihre Auswahl [1-!cnt!]:
if %answer% LEQ !cnt! echo Sie haben die VM mit Namen '!VM%answer%!' gewählt  
Gruß jodel32
Friemler
Lösung Friemler 28.04.2015 aktualisiert um 11:37:48 Uhr
Goto Top
Hallo Markus,

wozu die Datei mit den VM-Namen mit Nummern verhunzen? So ein Auswahlmenü kann man auch komplett dynamisch programmieren:
@echo off & setlocal

set "InFile=.\VMs.txt"  


:InputLoop
  cls

  set "ItemNo=1"  

  for /f "usebackq delims=" %%l in ("%InFile%") do (  
    call :PrintItem "%%l"  
  )

  echo.
  set "Selected="  
  set /p "Selected=Wählen Sie eine VM aus (Enter für Abbruch) "  

  if "%Selected%" equ "" goto :Quit  

  set "ItemNo=1"  

  for /f "usebackq delims=" %%l in ("%InFile%") do (  
    set "VMName=%%l"  
    call :FindItem "%Selected%" && goto :Action  
  )

  echo.
  echo Bitte geben Sie eine der angezeigten Nummern ein.
  pause
goto :InputLoop


:Action
echo.
echo Ausgewählte VM: %VMName%


:Quit
echo.
exit /b 0



::****************************************************************
::                        Unterprogramme
::****************************************************************
:PrintItem
  echo %ItemNo% - %~1
  set /a ItemNo+=1
exit /b 0


:FindItem
  if "%ItemNo%" equ "%~1" exit /b 0  
  set /a ItemNo+=1
exit /b 1

Gruß
Friemler
AngryDad
AngryDad 28.04.2015 um 11:44:02 Uhr
Goto Top
Danke Jungs!

Klappt prima - hab die Lösung von Jodel genommen - weil se kürzer ist...

Hab nur noch ein Problem:

Bekomme jetzt in die Variable !VM%answer%! z.B. OwnCloud"
Da muss noch das Anführungszeichen am Ende weg, sonst kann ich die Variable im weiteren Verlauf nicht verwenden.

Danke Nochmal!

Mfg.

Markus
114757
Lösung 114757 28.04.2015 aktualisiert um 13:12:54 Uhr
Goto Top
Zitat von @AngryDad:
Bekomme jetzt in die Variable !VM%answer%! z.B. OwnCloud"
Da muss noch das Anführungszeichen am Ende weg, sonst kann ich die Variable im weiteren Verlauf nicht verwenden.
Das wird in der Batch bereits in dieser Zeile mit der Tilde in der Laufvariablen gemacht
 set "VM!cnt!=%%~a" 
gemacht wenn deine Textdatei so wie du sagtest aussieht:
"OwnCloud"
"Mail"
"Webs" 
landet in der Variablen nur der Name ohne Anführungszeichen, deine Textdatei muss also entweder einen Fehler haben oder anderst aufgebaut sein.
Vermutlich hast du da keine richtigen Anführungszeichen am Ende, überprüfe die ASCII Codes.

Gruß jodel32
AngryDad
AngryDad 28.04.2015 um 12:41:22 Uhr
Goto Top
So wird die txt erstellt.
Mir ist gerade aufgefallen das hinter dem 2 ten " noch ein Leerzeichen in jeder Zeile ist. face-sad


@"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" list vms > Temp.txt

Ergebnis:

"OwnCloud" {b69afb3b-578e-400e-9696-c5b269898e3c}
"Mail" {af862787-997d-4af9-b7ce-55633509ded1}
"Webs" {7714504a-5e8c-4023-bc32-053251642d74}
"SeaNAS" {b6447690-c948-4960-944e-c3a2f5ed9528}
"Seafile" {112225a8-b70b-4576-b874-81bd829f27f5}
"Insurgency" {0f742d3b-6a61-4318-af09-dde95875caa1}
"UB-0001" {6cc1aa00-8031-430f-ac45-3b006592f3b9}
"TL-0002" {82536db7-d0b0-4fb0-9ace-28cd60829c6c}

for /F "tokens=1*" %%a in (Temp.txt) do echo %%a >> Temp1.txt

Ergebnis:

"OwnCloud"
"Mail"
"Webs"
"SeaNAS"
"Seafile"
"Insurgency"
"UB-0001"
"TL-0002"

Wird dann warscheinlich an dem Leerzeichen liegen......
114757
Lösung 114757 28.04.2015 aktualisiert um 13:12:31 Uhr
Goto Top
Zitat von @AngryDad:
for /F "tokens=1*" %%a in (Temp.txt) do echo %%a >> Temp1.txt
Wird dann warscheinlich an dem Leerzeichen liegen......
jup, lass das Leerzeichen vor der Ausgabeumleitung weg dann klappts auch:
 for /F "tokens=1*" %%a in (Temp.txt) do echo %%a>> Temp1.txt
btw. brauchst du diesen Zwischenschritt in eine Textdatei doch gar nicht sondern kannst direkt den Output der Applikation verwenden ...
@echo off & setlocal enabledelayedexpansion
Set /a cnt=0
echo Bitte VM selektieren
echo.
for /f delims^=^"^ tokens^=1 %%a in ('"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" list vms') DO @(  
    set /a cnt+=1
    set "VM!cnt!=%%~a"  
    echo [!cnt!] - %%~a
)
echo.
set /p answer=Ihre Auswahl [1-!cnt!]:
if %answer% LEQ !cnt! echo Sie haben die VM mit Namen '!VM%answer%!' gewählt  
AngryDad
AngryDad 28.04.2015 um 13:09:00 Uhr
Goto Top
Super!
Danke Nochmal, funktioniert prima!

Ich kann mir gut vorstellen das ich 50% von meiner batch eigentlich nicht brauchen
würde.
Allerdings möchte ich das ganze für mich - als NOOB - so verständlich wie möglich halten.
Falls mal was zu ändern ist steh ich sonst da wie die Kuh vorm neuen Scheunentor face-wink

Als denn - schönen Tag noch!
Mfg.
Markus