Woher kommt das Leerzeichen?
Hallo zusammen,
meine Erkenntnisse habe ich aus diesem Echo ohne Zeilenumbruch und ähnliche Spielereien
Obwohl ich meine (Sport)aufgabe als gelöst betrachte, fuchst mich doch ein kleiner Schönheitsfehler. Vielleicht kann mir ja jemand bestätigen, dass es einfach so ist ....
Aufgabe:
Aus einer AD-Gruppe die Benutzerkennungen auslesen und durch Kommata getrennt in einer Zeile schreiben.
Script:
Das ist die Bildschirmausgabe:
xxxx1673,xxxx0885
So sieht die Logdatei aus:
xxxx1673 ,xxxx0885
Hinter der UserID wird zusätzlich ein Leerzeichen ausgegeben. Warum?
Markus
meine Erkenntnisse habe ich aus diesem Echo ohne Zeilenumbruch und ähnliche Spielereien
Obwohl ich meine (Sport)aufgabe als gelöst betrachte, fuchst mich doch ein kleiner Schönheitsfehler. Vielleicht kann mir ja jemand bestätigen, dass es einfach so ist ....
Aufgabe:
Aus einer AD-Gruppe die Benutzerkennungen auslesen und durch Kommata getrennt in einer Zeile schreiben.
Script:
@echo off & setlocal
Set Gruppe=%1
set count=0
set tz=
set LogFile=%~n0.txt
if /i "%2"=="NoDel" (
set count=2
) else (
if exist %Logfile% del %LogFile%
)
for /f "tokens=2 delims=,=" %%a in ('dsquery group -name "%Gruppe%" ^| dsget group -members') do call :Machwat %%a
goto :eof
:Machwat
Set Userid=%1
Set /A count+=1
if %count% gtr 1 set tz=,
echo.|set /p=%tz%%userid%
echo.|set /p=%tz%%userid%>>%LogFile%
Das ist die Bildschirmausgabe:
xxxx1673,xxxx0885
So sieht die Logdatei aus:
xxxx1673 ,xxxx0885
Hinter der UserID wird zusätzlich ein Leerzeichen ausgegeben. Warum?
Markus
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 162389
Url: https://administrator.de/contentid/162389
Ausgedruckt am: 24.11.2024 um 17:11 Uhr
9 Kommentare
Neuester Kommentar
Hallo BigWim,
die Antwort findet man wie so oft mit echo on
Wie man bei CCC sehen kann ist sogar die Reihenfolge der Redirections wichtig, also ob erst IN oder erst OUT.
Das eigentliche Problem entsteht also praktisch beim set Befehl selbst, durch die Redirection wird ein Space erzeugt, dass kann am einfachsten dadurch unterdrückt werden indem man den Ausdruck in Anführungszeichen setzt, weil SET dann nur den Teil bis zum letzten Anführungszeichen auswertet, egal was oder wieviel danach noch kommt (wie man bei "GGG" sehen kann).
Grüße
jeb
die Antwort findet man wie so oft mit echo on
echo on
<nul set /p .=AAA>> a.txt
set /p .=BBB<nul >>a.txt
set /p .=CCC>>a.txt <nul
echo.|set /p .=DDD>> a.txt
echo.|set /p ".=EEE">> a.txt
<nul set /p .=FFF>> a.txt
echo.|set /p ".=GGG" xyzABC >> a.txt
---- Inhalt a.txt ----
AAABBBCCC DDD EEEFFFGGG
--- Ausgabe durch ECHO ON ----
C:\temp>set /p .=AAA 0<nul 1>>a.txt
C:\temp>set /p .=BBB 0<nul 1>>a.txt
C:\temp>set /p .=CCC 1>>a.txt 0<nul
C:\temp>echo. | set /p .=DDD 1>>a.txt
C:\temp>echo. | set /p ".=EEE" 1>>a.txt
C:\temp>set /p .=FFF 0<nul 1>>a.txt
C:\temp>echo. | set /p ".=GGG" xyzABC 1>>a.txt
Wie man bei CCC sehen kann ist sogar die Reihenfolge der Redirections wichtig, also ob erst IN oder erst OUT.
Das eigentliche Problem entsteht also praktisch beim set Befehl selbst, durch die Redirection wird ein Space erzeugt, dass kann am einfachsten dadurch unterdrückt werden indem man den Ausdruck in Anführungszeichen setzt, weil SET dann nur den Teil bis zum letzten Anführungszeichen auswertet, egal was oder wieviel danach noch kommt (wie man bei "GGG" sehen kann).
Grüße
jeb
Moin BigWim,
wie jeb-the-batcher gerade wieder gezeigt hat, tun sich bei manchen Vorgehensweisen Fragen auf,
deren Antworten eigentlich nur neue Fragen aufwerfen.
Ich empfehle in solchen Fällen immer eine frühzeitige Änderung der Vorgehensweise...
--> ich würde statt diesem ganzen Häppchenweise-User-für-User-ggf-mit-Komma-getrennt-einzeln-rausdrück-Gelumpe
doch eher den ganzen String in EINER Variable sammeln und dann rausschreiben, wenn ich mit dem Sammeln fertig bin.
und dann auch nur schreiben, wenn es was zu schreiben gibt.
Spart Zeilen, Variablen, ein komplettes Call-Center und schont so nicht-nichtwachsende Rohstoffe.
Beispiel ausgehend von deinem Skript:
Ist doch ein bisschen schlanker..... wie jetzt in dieser Zeit auch anzustreben ist.
Grüße
Biber
wie jeb-the-batcher gerade wieder gezeigt hat, tun sich bei manchen Vorgehensweisen Fragen auf,
deren Antworten eigentlich nur neue Fragen aufwerfen.
Ich empfehle in solchen Fällen immer eine frühzeitige Änderung der Vorgehensweise...
--> ich würde statt diesem ganzen Häppchenweise-User-für-User-ggf-mit-Komma-getrennt-einzeln-rausdrück-Gelumpe
doch eher den ganzen String in EINER Variable sammeln und dann rausschreiben, wenn ich mit dem Sammeln fertig bin.
und dann auch nur schreiben, wenn es was zu schreiben gibt.
Spart Zeilen, Variablen, ein komplettes Call-Center und schont so nicht-nichtwachsende Rohstoffe.
Beispiel ausgehend von deinem Skript:
@echo off & setlocal enabledelayedExpansion
Set Gruppe=%1
Set "alles="
set LogFile=%~n0.txt
if /i "%2"=="NoDel" (
set count=2
) else (
if exist %Logfile% del %LogFile%
)
::for /f "tokens=2 delims=,=" %%a in ('dsquery group -name "%Gruppe%" ^| dsget group -members') do (
REM STATT ('dsquery..." ) rufe ich zur Demo hier 'Net localgroup' als Beispiel
for /f "tokens=1 delims=,=" %%a in ('net localgroup^|findstr /C:"*"') do (
If not defined Alles (set "Alles=%%a") else Set "Alles=!Alles!,%%a"
)
if defined Alles (
echo %Alles%
REM [wenn es ein logfile gibt-entREMen] echo %Alles%>>%LogFile%
)
goto :eof
Ist doch ein bisschen schlanker..... wie jetzt in dieser Zeit auch anzustreben ist.
Grüße
Biber
@Biber
Dort war ich gedanklich auch schon - allerdings würde bei vorhandener Datei die darin befindliche Zeile nicht fortgesetzt, weshalb ggf diese (hoffentlich nicht zu lange) Zeile vorweg einzulesen wäre ...
Grüße
bastla
Dort war ich gedanklich auch schon - allerdings würde bei vorhandener Datei die darin befindliche Zeile nicht fortgesetzt, weshalb ggf diese (hoffentlich nicht zu lange) Zeile vorweg einzulesen wäre ...
Grüße
bastla