muddi
Goto Top

Anfuehrungszeichen in einer Batchdatei

Hallo,

Ich habe folgendes Problem:

@echo off
set find=%SystemRoot%\System32\find.exe
echo datei.txt|%find% "(Anfuerungszeichen)" >nul

rem Die Batch soll in der datei.txt nach Anführungszeichen suchen.
if errorlevel 1 (mach irgendwas)

rem Wenn er nicht fündig wird, soll eben etwas geschehen.
rem Das Problem ist, dass man hinter %find% keine 3 Anführungszeichen stehen lassen kann.
pause
exit

rem Ist es irgendwie möglich, über den ASCII-Code von (") das (") anzusprechen. Der Code ist glaub ich 34.

Ich hoffe, jemand hat die Lösung.

Gruß
Muddi

Content-Key: 38630

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

Ausgedruckt am: 28.03.2024 um 21:03 Uhr

Mitglied: DaSam
DaSam 23.08.2006 um 19:39:36 Uhr
Goto Top
find /I """" \test.txt findet bei mir das Anführungszeichen.

cu,
Alex
Mitglied: Biber
Biber 23.08.2006 um 23:40:43 Uhr
Goto Top
Moin Muddi,
dass man hinter %find% keine 3 Anführungszeichen stehen lassen kann..
Wie DaSam geschrieben hat - dann nimm doch vier davon.

2 davon umschließen den Suchtext.
1 ist der Suchtext. Und das muss eben als 2 Anführungszeichen übergeben ("maskiert") werden.

Wenn das nicht einleuchtet:
Bei der etwas mehr *nix-artigen Variante "FindStr.exe" kannst Du auch explizit nach Sonderzeichen und Hex-Werten suchen. Siehe FindStr /?.

Gruß
Biber
Mitglied: Muddi
Muddi 24.08.2006 um 12:40:57 Uhr
Goto Top
OK, danke.
Alles klar.

Aber ich habe noch ne Frage zu den Batchdateien, wollte nicht extra nochmal nen Thread aufmachen. Also:
Ich habe einen Ordner (meinverzeichnis) in dem sind wieder weitere Ordner, die ich nicht kenne, die anzahl kenne ich auch nicht, aber es ist mindestens einer:
ordner1
ordner2
ordner3
ordnern

@echo off
cd %systemdrive%\meinverzeichnis
dir
rem Jetzt kommen ja alle Ordner und Dateien in dem Ordner.
rem Wie kann man allen Ordnern eine Variable zuweisen.
rem dass nachher a=ordner1 b=ordner2 usw...
rem Warscheinlich eine for-Schleife, oder?

Gruß,
Muddi
Mitglied: DaSam
DaSam 24.08.2006 um 19:29:19 Uhr
Goto Top
Das macht man mit dem Parameter /d in einer for-Schleife. Beispiel:

for /d %i in (*.*) do echo %i

Alledrings hast Du dann immer alles in %i drinstehen und nicht in a... (Was machst Du, wenn es mehr als 26 Verzeichnisse gibt ??? Und was machst Du dann weiter mit deinen Variablen a... ???)

cu,
Alex
Mitglied: Muddi
Muddi 24.08.2006 um 20:12:53 Uhr
Goto Top
Alledrings hast Du dann immer alles in %i
drinstehen und nicht in a... (Was machst Du,
wenn es mehr als 26 Verzeichnisse gibt ???
Und was machst Du dann weiter mit deinen
Variablen a... ???)

Also das Programm sucht in dem Ordner (je nach Pc ist das %systemdrive%\Programme\Steam\SteamApps
nach den registrierten Accounts, die alle einen Ordner haben. Der User gibt anschließend an, in welchen Account bestimmte Dateien, also Karten, Skins usw... kopiert werden sollen.
Und mehr als 26 Accounts wird es nicht geben.face-smile
Mitglied: Biber
Biber 27.08.2006 um 20:54:26 Uhr
Goto Top
Hmm, wohl wahr, Muddi,

dass kein User mehr als 26 Accounts haben wird.
Aber wegen der Les- und Wartbarkeit des Batchschnipsels würde ich DaSam's Ansatz eher so variieren:

::-------snipp GetAllSteamAccounts.bat
@echo off & Setlocal EnableDelayedExpansion
set /a "AccCnt=0"  
for /d %%i in (%ProgramFiles%\Steam\SteamApps\*.*) do call :SetNextAccount %%i
goto CopyMoveActions

:SetNextAccount
Set /a "AccCnt+=1"  
Set "SteamAccount%AccCnt%=%1"  
Goto :eof

:CopyMoveActions
if AccCnt==0 (echo Kein Steam-Account gefunden) && goto :eof
For /L %%i in (1,1,%AccCnt%) Do (
          copy !SteamAccount%%i!\*.* W:\ohin\auch\immer...
          machsonstwas....
)
::-------snapp GetAllSteamAccounts.bat
Danach hast Du alle Accounts in Umgebungsvariablen %SteamAccount1% bis %SteamAccountNN% und kannst alles haönwegs nachvollziehbar im Batch runtertippen.

Gruß
Biber
P.S. Hat aber alles wenig mit "Anführungszeichen im Batch" zu tun.
Darf ich diesen Thread schließen?
Mitglied: Muddi
Muddi 10.09.2006 um 19:45:55 Uhr
Goto Top
Hallo Biber,

Sorry, konnte nicht früher antworten, war im Urlaub :D.


GetAllSteamAccounts.bat
@echo off & Setlocal
EnableDelayedExpansion
set /a "AccCnt=0"
for /d %%i in
(%ProgramFiles%\Steam\SteamApps\*.*) do call
:SetNextAccount %%i
goto CopyMoveActions

:SetNextAccount
Set /a "AccCnt+=1"
Set "SteamAccount%AccCnt%=%1"
Goto :eof


Also wenn ich das richtig sehe, ist der Hauptteil nach diesen Zeilen oben vorbei, oder? wegen goto :eof
Aber wenn ich jetzt z.B.
echo %SteamAccount1% 
hinzufüge, heißt es nur ECHO ist ausgeschaltet, warum?


For /L %%i in (1,1,%AccCnt%) Do (


Diese Zeile verstehe ich auch noch nicht so ganz.


Sorry wegen meinen Noobfragen

Bitte noch kein Schloss dranhängen, bis das bei mir auch funktioniert.

Grüße
Muddi
Mitglied: Biber
Biber 10.09.2006 um 21:19:21 Uhr
Goto Top
Moin Muddi,

Ich hatte tatsächlich noch einen Fehler drin...
...und zwar in der Zeile if AccCnt==0 (echo Kein Steam-Account gefunden) .
Da fehlten die Prozentzeichen um die Variable %AccCnt%.
Ich habe auch noch mal die Zeilen optisch neu arrangiert, damit deutlicher wird, was der eigentliche Batch ist und was Unterroutine.
Ansonsten liefert der zum Test geänderte folgende Batch-Schnipsel:

::-------snipp GetAllSteamAccounts.bat
@echo off & Setlocal EnableDelayedExpansion
set /a "AccCnt=0"  
for /d %%i in (%ProgramFiles%\Steam\SteamApps\*.*) do call :SetNextAccount %%i

if %AccCnt%==0 (echo Kein Steam-Account gefunden) && goto :eof
For /L %%i in (1,1,%AccCnt%) Do (
     echo     copy !SteamAccount%%i!\*.* W:\ohin\auch\immer...
     rem     machsonstwas....
)
goto :eof
~~~~~ Ende HauptBatch ~~~~
:SetNextAccount
Set /a "AccCnt+=1"  
Set "SteamAccount%AccCnt%=%1"  
Goto :eof
::-------snapp GetAllSteamAccounts.bat
...beim Aufruf vom CMD-Prompt folgendes Ergebnis:
Z:\>
$cmd$GetAllSteamAccount.bat
    copy D:\Programme\Steam\SteamApps\Chappi\*.* W:\ohin\auch\immer...
    copy D:\Programme\Steam\SteamApps\Heinzi\*.* W:\ohin\auch\immer...
    copy D:\Programme\Steam\SteamApps\c00lm4n\*.* W:\ohin\auch\immer...

Natürlich nur, wenn ich die Struktur richtig verstanden habe und unterhalb von "%programFiles%\Steam\Steamapps" diese Unterverzeichnisse für die User Chappy, Heinzi und c00lm4n existieren.

Also wenn ich das richtig sehe, ist der Hauptteil nach diesen Zeilen oben vorbei, oder? wegen goto :eof
Aber wenn ich jetzt z.B.
echo %SteamAccount1%

hinzufüge, heißt es nur ECHO ist ausgeschaltet, warum?

Weil keine Variable %SteamAccount1 gesetzt wurde. Dann ist die Verzeichnisstruktur anders, als ich es verstanden habe.
Bei mir liefert [%programFiles% ist bei mir D:\Programme, wie ja auch im Batch-Output angezeigt wird] die folgenden Unterverzeichnisse
$cmd$dir /b /a:d %ProgramFiles%\Steam\SteamApps
Chappi
Heinzi
c00lm4n
Und bei dir?

For /L %%i in (1,1,%AccCnt%) Do (

Diese Zeile verstehe ich auch noch nicht so ganz.

In %AccCnt% (also in der Variablen AccountCount, aber der Name war mir zu lang) steht die Anzahl der gefundenen SubDirs. Bei mir 3.
Also wird die Zählschleife
"For /L %%i in (1,1,%AccCnt%) Do (.."
übersetzt zu
For /L %%i in (1,1,3) Do (...
--> also vom Anfangswert 1 (erster Parameter) immer erhöht um 1 (zweiter Parameter) bis zum Endwert 3 (dritter Parameter) das getan, was nach dem "DO.." folgt.

Bitte probiers noch mal mit der einen Korrektur bzw. poste mal das DIR-Ergebnis.

Gruß
Biber
Mitglied: Muddi
Muddi 11.09.2006 um 11:22:34 Uhr
Goto Top
Moin,

Biber, du bist genial! Es geht!

Die meisten Leute haben Steam unter %programfiles%\Steam installiert oder, so wie ich, unter %programfiles%\valve\steam

%programfiles% ist bei mir c:\programme

Das Valve hab ich dann noch hinzugefügt. Ergebnis:

dir /b /a:d %ProgramFiles%\valve\Steam\SteamApps
franzake
Muddi

Bei der Batch ich hab sie mal so geschrieben:

 
@echo off & Setlocal EnableDelayedExpansion
set /a "AccCnt=0"  
for /d %%i in (%ProgramFiles%\Valve\Steam\SteamApps\*.*) do call :SetNextAccount %%i

if %AccCnt%==0 (echo Kein Steam-Account gefunden) && goto :eof
For /L %%i in (1,1,%AccCnt%) Do (
     echo     copy !SteamAccount%%i!\*.* W:\ohin\auch\immer...
     echo Steamaccoun1=%SteamAccount1%
     echo Steamaccount2%SteamAccount2%
)
:SetNextAccount
Set /a "AccCnt+=1"  
Set "SteamAccount%AccCnt%=%1"  

pause

Output:
Drücken Sie eine beliebige Taste...
Drücken Sie eine beliebige Taste...
copy c:\programme\valve\Steam\SteamApps\franzake\*.* w:\ohin\auch\immer...
Steamaccount1=C:\programme\valve\Steam\SteamApps\franzake
Steamaccount2=C:\programme\valve\Steam\SteamApps\Muddi
copy c:\programme\valve\Steam\SteamApps\Muddi\*.* w:\ohin\auch\immer...
Steamaccount1=C:\programme\valve\Steam\SteamApps\franzake
Steamaccount2=C:\programme\valve\Steam\SteamApps\Muddi
Drücken Sie eine beliebige Taste...

Er findet Sie also. OK letzte Frage face-smile

Wie macht man das jetzt am besten mit der Auswahl, dass außerdem nur der Accountname angezeigt wird (ist aber nicht soo wichtig, wäre aber schöner beim output als immer das c:\programme\valve\steam\usw... vor dem eigentlichen Namen)

echo Welcher Steamaccount soll benutzt werden?
echo 1=%SteamAccount1%
if exist %SteamAccount2% echo 2=%Steamaccount2%
if exist %SteamAccountNN% echo NN=%SteamAccountNN%
....
....
set /p which_acc=Bitte waehlen
if %which_acc%==1 ( rem kopiere irgendwas nach %Steamaccount1% oder sonst was)
rem usw...

Das ist dann aber viel Tipparbeit, bei maximal 26 Accounts face-sad

Weißt du eine elegantere Methode?

Gruß
Muddi
Mitglied: Biber
Biber 11.09.2006 um 11:58:11 Uhr
Goto Top
Na siehst Du, muddi,

es wird doch.. face-wink

Die Skizzen zu den nächsten Verfeinerungen:
a) den SteamAppPath in eine Variable packen, damit nur die Accounts selbst einfacher extrahiert und angezeigt werden können.
b) die Auswahl-Anzeige
:: ----snipp getSteamAccounts2.bat
@echo off & Setlocal EnableDelayedExpansion
set "SteamAppsPath=%ProgramFiles%\Valve\Steam\SteamApps"  
set /a "AccCnt=0"  
for /d %%i in (%SteamAppsPath%\*.*) do call :SetNextAccount %%~ni

if %AccCnt%==0 (echo Kein Steam-Account gefunden) && goto :eof
For /L %%i in (1,1,%AccCnt%) Do (
     echo     copy %SteamAppsPath%\!SteamAccount%%i!\*.* W:\ohin\auch\immer...
     REM ----gehört nicht in diese Schleife --echo Steamaccoun1=%SteamAccount1%
     REM ----  ......Steamaccount2%SteamAccount2%
)
:SetNextAccount
Set /a "AccCnt+=1"  
Set "SteamAccount%AccCnt%=%1"  
echo SteamAccount%AccCnt%: [!SteamAccount%AccCnt%!]

DONE Wie macht man das jetzt am besten mit der Auswahl, dass außerdem nur der Accountname angezeigt wird

 :: ungetestete Skizze für die Auswahl; Ermittlung der Accounts siehe oben
....
echo Welcher Steamaccount soll benutzt werden?
echo 1=%SteamAccount1%
For /L %%i in (1,1,26) do if defined SteamAccount%%i echo %%i [!Steamaccount%%i!]
set /p which_acc=Bitte waehlen
Set ThisAccount=SteamAccount%which_acc%

REM ..und dann ...mach was mit %ThisAccount%

So, Mittach...

Biber
Mitglied: Muddi
Muddi 11.09.2006 um 18:20:25 Uhr
Goto Top
Es geht so gut wie, der ouput sieht nur noch nicht so schön aus. face-smile

Ich habe die beiden Schnipsel mal zusammengeklebt, warscheinlich falsch.

@echo off & Setlocal EnableDelayedExpansion
set "SteamAppsPath=%ProgramFiles%\Valve\Steam\SteamApps"  
set /a "AccCnt=0"  
for /d %%i in (%SteamAppsPath%\*.*) do call :SetNextAccount %%~ni

if %AccCnt%==0 (echo Kein Steam-Account gefunden) && goto :eof
For /L %%i in (1,1,%AccCnt%) Do (
     echo     copy %SteamAppsPath%\!SteamAccount%%i!\*.* W:\ohin\auch\immer...
     REM ----gehört nicht in diese Schleife --echo Steamaccoun1=%SteamAccount1%
     REM ----  ......Steamaccount2%SteamAccount2%
)

:SetNextAccount
Set /a "AccCnt+=1"  
Set "SteamAccount%AccCnt%=%1"  
echo SteamAccount%AccCnt%: [!SteamAccount%AccCnt%!]

:auswahl
echo Welcher Steamaccount soll benutzt werden?
For /L %%i in (1,1,26) do if defined SteamAccount%%i echo %%i !Steamaccount%%i!
set /p which_acc=Bitte waehlen
Set ThisAccount=!SteamAccount%which_acc%!   ---hier haben die Ausrufezeichen gefehlt, rem ich hab das dann nach längerem probieren irgendwie rausgefunden :)

REM ..und dann ...mach was mit %ThisAccount%
echo Sie haben %ThisAccount% gewählt
pause

Er frägt nämlich 3 mal nach, welchen Steamaccount man benutzen will.

Beim ersten mal gibt es nur:

Steamaccount1: [franzake]
Welcher SteamAccount soll benutzt werden?
1 franzake
Bitte waehlen

Beim zweiten mal:
Steamaccount2: [Muddi]
Welcher SteamAccount soll benutzt werden?
1 franzake
2 Muddi
Bitte waehlen

Beim dritten mal:
Steamaccount3:  ---gibt es ja nicht
Welcher SteamAccount soll benutzt werden?
1 franzake
2 Muddi
Bitte waehlen

Aber bis auf das funktioniert alles. Nach der Wahl ist dann %ThisAccount% Muddi oder franzake und man kann in den Ordner Dateien kopieren.

Schönen Abend noch
Muddi
Mitglied: Biber
Biber 11.09.2006 um 19:38:32 Uhr
Goto Top
Na gut, Muddi,

dann machen wir es mal halbwegs komplett.
:: ----------snipp SteamAccounts3.bat
@echo off & Setlocal EnableDelayedExpansion
set "SteamAppsPath=%ProgramFiles%\Valve\Steam\SteamApps"  
set /a "AccCnt=0"  
for /d %%i in (%SteamAppsPath%\*.*) do call :SetNextAccount %%~ni

if %AccCnt%==0 (echo Kein Steam-Account gefunden) && goto :eof

:auswahl
cls & echo Welcher Steamaccount soll benutzt werden?
For /L %%i in (1,1,26) do if defined SteamAccount%%i echo %%i !Steamaccount%%i!
echo.
echo X Abbrechen
echo.
set /p "which_acc=Bitte waehlen: "  
if /i [%which_acc%]==[X] goto :eof
(Set /a which_acc=which_acc+0) 2>nul
If %which_acc%==0 (echo Keine Zahl eingegeben!) & pause & goto auswahl
If %which_acc% GTR %AccCnt% (echo Zahl zu gross!) & pause & goto auswahl
Set "ThisAccount=!SteamAccount%which_acc%!"   
echo Sie haben %ThisAccount% gewählt
pause    
    REM ..und dann ...mach was mit %ThisAccount%   
    echo     copy %SteamAppsPath%\%ThisAccount%\*.* W:\ohin\auch\immer...
goto :eof
~~~~~~~~~ Ende Hauptbatch
:SetNextAccount
Set /a "AccCnt+=1"  
Set "SteamAccount%AccCnt%=%1"  
echo SteamAccount%AccCnt%: [!SteamAccount%AccCnt%!]

So sähe dann der Output bei "richtiger" User-Eingabe aus:
Welcher Steamaccount soll benutzt werden?
1 user7
2 userDrei

X Abbrechen

Bitte waehlen: 2
Sie haben userDrei gewählt
Drücken Sie eine beliebige Taste . . .
    copy C:\Programme\Valve\Steam\SteamApps\userDrei\*.* W:\ohin\auch\immer...

und "keine Ziffer" und "zu große Ziffern" wird auch abgefangen.

Was Du eventuell noch ändern musst, ist der Pfad..
Statt set "SteamAppsPath=%ProgramFiles%\Valve\Steam\SteamApps"
eher so was:
...
set "SteamAppsPath=%ProgramFiles%\Valve\Steam\SteamApps"  
if not exist %SteamAppsPath% set "SteamAppsPath=%ProgramFiles%\Steam\SteamApps"  
if not exist %SteamAppsPath% (echo SteamApps-Pfad nicht gefunden.) && goto :eof

Aber das bekommst Du schon hin... ein bisschen was flimmert ja jetzt schon auf dem Monitor.

BTW - darf ich jetzt den Beitrag auf "Geschlossen" setzen bitte? face-wink
Gruß
Biber
Mitglied: Muddi
Muddi 11.09.2006 um 20:55:17 Uhr
Goto Top
Juhuuuuuuuuuuuuuuuuuuuu, jetzt geht alles perfekt. Bist der beste Biber und danke, dass du dir die Mühe gemacht hast. Das mit dem Steampfad finden hab ich per registry export gemacht, da der Installationspfad im Schlüssel HKLM\Software\Valve\Steam verzeichnet ist.

Ich habe noch eine letzte Frage, die etwas mit Anführungszeichen zu tun hat. Aber wenn du willst kann ich auch einen neuen Thread aufmachen. Also ich habe ein Programm geschrieben, dass die Treiber für Hardwarekomponenten runterlädt, da ich mich bei 3PCs nicht immer durch diese Homepages klicken will, um endlich zum Downloadlink zu kommen. Da hab ich das Tool wget.exe zur Hilfe gezogen.
am Anfang soll das Programm das System analysieren. Dafür habe ich den Registryeintrag

HKEY_LOCAL_MACHINE\Hardware\Description\System\CentralProcessor\0

in eine Textdatei exportiert (CPU.txt), weil es hier um den Prozessor geht. Danach die wichtige Zeile:

"ProcessorNameString"="AMD Sempron(tm) 2800+"

in eine neue Textdatei (CPU_NAME.txt) geschrieben. Dabei soll "AMD Sempron(tm) 2800+" ohne Anführungszeichen ausgelesen werden.
Das Problem bei

for /f "delims=" tokens=3" %%p in (CPU_NAME.txt) do set CPU=%%i
echo Prozessor=%CPU%

ist, dass er dann sofort anbricht.

Gruß
Muddi
Mitglied: Biber
Biber 11.09.2006 um 21:08:38 Uhr
Goto Top
Ich würde das Setzen der Variablen dann so machen:

for /f "delims== tokens=2" %%p in (cpu_name.txt) do set "CPU=%%~p"  

Also das Gleichheitszeichen als Delimiter und dann das 2. Token nehmen.
Ergebnis am CMD-Prompt:
>set cpu
CPU=AMD Sempron(tm) 2800+
So, Feierabend für heute.

Biber
Mitglied: Muddi
Muddi 11.09.2006 um 21:21:18 Uhr
Goto Top
So, Feierabend für heute.

Ja, du kannst den Thread jetzt zu machen.

Danke für alles und schönen Abend noch
Muddi