ausdrucker
Goto Top

Win10 Batch Skript: for F unterschlägt alle Zeilen bis auf die Letzte

Hallo,

Ich möchte Regestry-Werte auslesen und verarbeiten.
Dazu ein Batch Skript:


@echo off

for /F %%a in ('reg query "HKCU\Printers\Defaults"') do (  
set regkey=%%a
set regkey2=%%b)

echo Alle Drucker: %regkey% und %regkey2%
echo.
echo Ohne Schleife auslesen:
reg query HKCU\Printers\Defaults
Die Ausgabe verschluckt immer alle Zeilen, ausser die Letzte:

Alle Drucker: HKEY_CURRENT_USER\Printers\Defaults\{D830F131-672B-4659-9F5E-9BCC5B591E8F} und %b

Ohne Schleife auslesen:

HKEY_CURRENT_USER\Printers\Defaults\{A97BF0FD-E3B5-4035-9A06-C11D30D5716D}
HKEY_CURRENT_USER\Printers\Defaults\{D830F131-672B-4659-9F5E-9BCC5B591E8F}


Eigentlich müsste ja in "regkey" Diese Zeile stehen:
HKEY_CURRENT_USER\Printers\Defaults\{A97BF0FD-E3B5-4035-9A06-C11D30D5716D}

Was mache ich falsch?

Content-Key: 667638

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

Printed on: April 25, 2024 at 06:04 o'clock

Member: mbehrens
mbehrens Jun 16, 2021 at 11:27:24 (UTC)
Goto Top
Zitat von @ausdrucker:

Ich möchte Regestry-Werte auslesen und verarbeiten.
Dazu ein Batch Skript:


@echo off
> 
> for /F %%a in ('reg query "HKCU\Printers\Defaults"') do (  
> set regkey=%%a
> set regkey2=%%b)
> 
> echo Alle Drucker: %regkey% und %regkey2%
> echo.
> echo Ohne Schleife auslesen:
> reg query HKCU\Printers\Defaults
Die Ausgabe verschluckt immer alle Zeilen, ausser die Letzte:

Alle Drucker: HKEY_CURRENT_USER\Printers\Defaults\{D830F131-672B-4659-9F5E-9BCC5B591E8F} und %b

Ohne Schleife auslesen:

HKEY_CURRENT_USER\Printers\Defaults\{A97BF0FD-E3B5-4035-9A06-C11D30D5716D}
HKEY_CURRENT_USER\Printers\Defaults\{D830F131-672B-4659-9F5E-9BCC5B591E8F}


Eigentlich müsste ja in "regkey" Diese Zeile stehen:
HKEY_CURRENT_USER\Printers\Defaults\{A97BF0FD-E3B5-4035-9A06-C11D30D5716D}

Was mache ich falsch?

Die falsche Tool für die Problemlösung verwendet face-wink

Die Klammersetzung scheint falsch, alternativ einfach ein Get-Printer in der PowerShell.
Member: Disse1987
Disse1987 Jun 16, 2021 at 12:28:24 (UTC)
Goto Top
Bin kein Spezi in dem Bereich aber musst du nicht einfach den Befehl in eine Zeile schreiben? also das was in 3 4 5 steht in die 3!?

Skripte arbeiten doch Befehl für Befehl ab also Zeile für Zeile
Member: ausdrucker
ausdrucker Jun 16, 2021 updated at 13:14:15 (UTC)
Goto Top
Nein, die Klammern erweitern die Kommandos auf mehrere Zeilen.

Das klappt z.B.:

@echo off

for /f "tokens=1,2 delims=#" %%a in ("teil1#teil2") do (  
  set BEFORE_HASH=%%a
  set AFTER_HASH=%%b
)
echo %BEFORE_HASH%
echo %AFTER_HASH%

pause

Ausgabe:
teil1
teil2


Nur arbeite ich da mit tokens und delims.
Aber was sind delims für Zeilenumbrüche?

Jedenfalls bessert sich nichts mit tokens:

for /F "tokens=1,2" %%a in ('reg query "HKCU\Printers\Defaults"') do (  
set regkey=%%a
set regkey2=%%b)

delims kenne ich nicht für Zeilenende. Sollen die nicht automatisch sein, so wie für Leerzeichen?
Member: TK1987
Solution TK1987 Jun 16, 2021 updated at 13:37:12 (UTC)
Goto Top
Moin,

Zitat von @ausdrucker:
Was mache ich falsch?
Offen gestanden: So ziemlich alles (angefangen bei der Wahl der einer toten Skriptsprache).

Eigentlich müsste ja in "regkey" Diese Zeile stehen:
Nein. Mit einer For-Schleife liest man Daten Zeilenweise ein, somit enthält die Variable %%a...
... beim ersten Durchlauf: HKEY_CURRENT_USER\Printers\Defaults\{A97BF0FD-E3B5-4035-9A06-C11D30D5716D}
... beim zweiten Durchlauf: HKEY_CURRENT_USER\Printers\Defaults\{D830F131-672B-4659-9F5E-9BCC5B591E8F}

Daher: Du setzt die Variable %regkey% im ersten Durchlauf auf die 1. Zeile; und überschreibst diese dann bei jedem weiteren Durchlauf immer wieder mir der nächsten Zeile.
Logisch also, dass du dann als Ergebnis immer nur die letzte Ausgabe erhälst.

In Variable %%b wirst du darüber hinaus überhaupt nie einen Inhalt vorfinden - zum einen, weil du diese in den Optionen der For-Schleife nicht zugewiesen hast (Tokens) - zum anderen, weil du damit immer nur die aktuelle Zeile splitten würdest, ohne Trennzeichenangabe (Delims) automatisch beim Standardtrennzeichen Leerzeichen, welche in der Ausgabe jedoch nicht vorhanden sind.

Wie @mbehrens schon schrieb, heute nimmt man für sowas Powershell.

Gruß Thomas
Member: erikro
erikro Jun 16, 2021 at 14:28:28 (UTC)
Goto Top
Moin,

Zitat von @TK1987:
Wie @mbehrens schon schrieb, heute nimmt man für sowas Powershell.

Yupp. Da reicht nämlich ein einfaches:

(get-childitem HKCU:\Printers\Defaults\).name

und gut ist.

Liebe Grüße

Erik
Member: ausdrucker
ausdrucker Jun 16, 2021 at 14:58:14 (UTC)
Goto Top
Das mit dem mehrmals Durchlaufen kann nicht sein.

Dieser Code zeigt, dass die For Schleife nur genau einmal durchlaufen wird:

@echo off
set /A counter=1
echo zaehler Initial: %counter%

set regkey=leer

for /F %%a in ('reg query "HKCU\Printers\Defaults"') do ( set regkey2=%%a  
set /A counter=%counter%+1
if "%regkey%" == "leer" ( set regkey=%%a )  
)

echo zaehlerende: %counter%
echo Alle Drucker1: %regkey%
echo Alle Drucker2: %regkey2%
echo.
echo Ohne Schleife auslesen:
reg query HKCU\Printers\Defaults

pause

Ausgabe:

zaehler Initial: 1
zaehlerende: 2
Alle Drucker1: HKEY_CURRENT_USER\Printers\Defaults\{D830F131-672B-4659-9F5E-9BCC5B591E8F}
Alle Drucker2: HKEY_CURRENT_USER\Printers\Defaults\{D830F131-672B-4659-9F5E-9BCC5B591E8F}

Ohne Schleife auslesen:

HKEY_CURRENT_USER\Printers\Defaults\{A97BF0FD-E3B5-4035-9A06-C11D30D5716D}
HKEY_CURRENT_USER\Printers\Defaults\{D830F131-672B-4659-9F5E-9BCC5B591E8F}


Scheint so, dass nur die letzte Zeile verarbeitet wird.
Mit Powershell kenne ich mich noch nicht aus face-sad
Member: TK1987
Solution TK1987 Jun 16, 2021 updated at 15:52:24 (UTC)
Goto Top
Zitat von @ausdrucker:
Das mit dem mehrmals Durchlaufen kann nicht sein.
Und ob das so ist.
Dieser Code zeigt, dass die For Schleife nur genau einmal durchlaufen wird:
Nein, denn ein falscher code zeigt überhaupt nichts.
set /A counter=%counter%+1
Ohne Variablenverzögerung kann das innerhalb einer For-Schleife nicht funktionieren. Entweder man macht es so:
@echo off
set counter=1
echo zaehler Initial: %counter%

for /F %%a in ('reg query "HKCU\Printers\Defaults"') do (  
set /A counter+=1
)

echo zaehlerende: %counter%
oder du hättest auch einfach mal einen echo-Befehl innerhalb deiner For-Schleife einbauen können:
@echo off

for /F %%a in ('reg query "HKCU\Printers\Defaults"') do (   
echo Inhalt von A: "%%a"  
)

Macht doch nichts, du hast ja oben schon 2 Lösungsvorschläge in Powershell erhalten. Wenn du die Drucker mit Namen und Infos auflisten will, hilft dir @mbehrens Code weiter. Wenn du tatsächlich, wie mit deinem Batch-Versuch, die Registrierungsschlüssel aufgelistet haben willst, hilft dir der Code von @erikro weiter. Von mir aus auch noch in der Form, wie du es Ursprünglich haben wolltest, in einer Zeile:
"Alle Drucker: "+((get-childitem HKCU:\Printers\Defaults\).name -Join ', ')  
Member: ausdrucker
ausdrucker Jun 16, 2021 at 18:16:08 (UTC)
Goto Top
Danke, das hat geholfen.
Hier nun die finale Lösung:

@echo off
setlocal enabledelayedexpansion

for /F %%a in ('reg query "HKCU\Printers\Defaults"') do ( set regkey2=%%a  
if "!regkey!" == "" ( set regkey=!regkey2! )  
)

echo Alle Drucker1: %regkey%
echo Alle Drucker2: %regkey2%
echo.
echo Ohne Schleife auslesen:
reg query HKCU\Printers\Defaults

pause

Die Ausgabe:

Alle Drucker1: HKEY_CURRENT_USER\Printers\Defaults\{A97BF0FD-E3B5-4035-9A06-C11D30D5716D}
Alle Drucker2: HKEY_CURRENT_USER\Printers\Defaults\{D830F131-672B-4659-9F5E-9BCC5B591E8F}

Ohne Schleife auslesen:

HKEY_CURRENT_USER\Printers\Defaults\{A97BF0FD-E3B5-4035-9A06-C11D30D5716D}
HKEY_CURRENT_USER\Printers\Defaults\{D830F131-672B-4659-9F5E-9BCC5B591E8F}


Problem gelöst! face-smile
Member: ausdrucker
Solution ausdrucker Jun 19, 2021 updated at 15:34:28 (UTC)
Goto Top
Die Lösung oben war sehr speziell.
Hier noch eine generischere Lösung, falls es mal jemand braucht:

@echo off
setlocal enabledelayedexpansion

REM Zaehlervariable
set counter=0
REM Wert fuer die Regestry
set MeinRegQuery=reg query "HKCU\Printers\ConvertUserDevModesCount"  
REM Suchtext definieren
set SuchText=L7400 Series

REM Zeilen einzeln in Variablen einlesen. Die Variable "regkey" wird durch eine angehaengte Zaehlervariable immer neu definiert.  
REM Wir erhalten so Variablen: regkey1, regkey2, regkey3 u.s.w. mit dem Inhalt der einzelnen Zeilen aus dem Wert der Regestry
for /F "tokens=*" %%a in ('%MeinRegQuery%') do (   
  set /A counter+=1
  set regkey!counter!=%%a
)


REM Nun können die Variablen regkey1, regkey2, regkey3  u.s.w. beliebig verarbeitet werden. Hier nur eine Demo:
REM Variablen regkey1, regkey2, regkey3  u.s.w. ausgeben bis "SuchText" gefunden wurde.   
for /L %%a in (1,1,%counter%) do ( 
  echo Variable %%a = "regkey%%a" = !regkey%%a!  
  echo !regkey%%a! | findstr "%SuchText%" > nul && echo. && echo     ****** Dein HP Drucker wurde gefunden in Zeile %%a ! ****** && Goto Halt  
)

:Halt
echo.

REM nur zur Demonstration: Das wäre die Ausgabe in der Konsole ohne Verarbeitung
echo Regestry-Wert ohne Schleife auslesen:
%MeinRegQuery%

pause


Hier die Ausgabe:

Variable 1 = "regkey1" = HKEY_CURRENT_USER\Printers\ConvertUserDevModesCount
Variable 2 = "regkey2" = OneNote REG_DWORD 0x1
Variable 3 = "regkey3" = Microsoft XPS Document Writer REG_DWORD 0x1
Variable 4 = "regkey4" = Microsoft Print to PDF REG_DWORD 0x1
Variable 5 = "regkey5" = Fax REG_DWORD 0x1
Variable 6 = "regkey6" = HP Officejet Pro L7400 Series REG_DWORD 0x1

Dein HP Drucker wurde gefunden in Zeile 6

Regestry-Wert ohne Schleife auslesen:

HKEY_CURRENT_USER\Printers\ConvertUserDevModesCount
OneNote REG_DWORD 0x1
Microsoft XPS Document Writer REG_DWORD 0x1
Microsoft Print to PDF REG_DWORD 0x1
Fax REG_DWORD 0x1
HP Officejet Pro L7400 Series REG_DWORD 0x1
$FriendlyName$ REG_DWORD 0x1
OneNote for Windows 10 REG_DWORD 0x1
PDF24 REG_DWORD 0x1
PDF24 Fax REG_DWORD 0x1
WinDisc REG_DWORD 0x1
USB001 REG_DWORD 0x1
hp officejet pro l7480 series REG_DWORD 0x1

Drücken Sie eine beliebige Taste . . .