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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 38630
Url: https://administrator.de/forum/anfuehrungszeichen-in-einer-batchdatei-38630.html
Ausgedruckt am: 11.04.2025 um 15:04 Uhr
15 Kommentare
Neuester Kommentar
Moin Muddi,
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
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
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:
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?
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
Gruß
Biber
P.S. Hat aber alles wenig mit "Anführungszeichen im Batch" zu tun.
Darf ich diesen Thread schließen?
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:
...beim Aufruf vom CMD-Prompt folgendes Ergebnis:
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.
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
Und bei dir?
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
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
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.
hinzufüge, heißt es nur ECHO ist ausgeschaltet, warum?
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
For /L %%i in (1,1,%AccCnt%) Do (
Diese Zeile verstehe ich auch noch nicht so ganz.
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
Na siehst Du, muddi,
es wird doch..
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
DONE Wie macht man das jetzt am besten mit der Auswahl, dass außerdem nur der Accountname angezeigt wird
So, Mittach...
Biber
es wird doch..
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
Na gut, Muddi,
dann machen wir es mal halbwegs komplett.
So sähe dann der Output bei "richtiger" User-Eingabe aus:
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:
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?
Gruß
Biber
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?
Gruß
Biber