bigwim
Goto Top

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:
@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

Content-ID: 162389

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

Ausgedruckt am: 24.11.2024 um 17:11 Uhr

76109
76109 10.03.2011 um 14:56:45 Uhr
Goto Top
Hallo BigWim!

Möglicherweise ein gleiches Problem wie hier (UniCode-Ausgabe).

Gruß Dieter
bastla
bastla 10.03.2011 um 14:58:17 Uhr
Goto Top
Hallo BigWim!

Eine Antwort habe ich zwar leider nicht zu bieten, ein möglicher Lösungsansatz könnte aber so aussehen:
<nul set /p=%tz%%userid%>>%LogFile%
Grüße
bastla
BigWim
BigWim 10.03.2011 um 15:37:28 Uhr
Goto Top
Hallo Ddid954, hallo Bastla,

sorry für die späte Rückmeldung, aber der Chef hatte kein Mitleid ...

@76109
habe die Ausgabedatei mit einem HEX-Editor geöffnet. Das Leerzeichen ist ein "normales" 20

@bastla
Es funktioniert, aber dass Du keine Antwort hast, kann ich fast nicht glauben face-wink

Vielen Dank!!!
Markus
jeb-the-batcher
jeb-the-batcher 10.03.2011 um 21:16:34 Uhr
Goto Top
Hallo BigWim,

die Antwort findet man wie so oft mit echo on face-smile
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
Biber
Biber 10.03.2011 um 21:37:47 Uhr
Goto Top
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... face-wink

--> 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
bastla
bastla 10.03.2011 um 23:48:19 Uhr
Goto Top
@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
BigWim
BigWim 11.03.2011 um 08:26:11 Uhr
Goto Top
Moin Biber,

Ich empfehle in solchen Fällen immer eine frühzeitige Änderung der Vorgehensweise... face-wink
Dafür bin ich (fast) immer offen face-wink

Häppchenweise-User-für-User-ggf-mit-Komma-getrennt-einzeln-rausdrück-Gelumpe
Das war der allererste Ansatz. Davon bin ich aber abgerückt, weil wir auch Gruppen mit mehreren 100 Usern haben.
Verkraftet das denn die SET-Anweisung wenn ich eine Zeichenkette von 2700 Zeichen (300 User * 9 Zeichen) einfüge?
OK, ich hab es jetzt nicht probiert, weil es eine kleine Sportaufgabe ist, die aber durchaus weiter ausbaufähig ist.

Zudem muß ich mich viel viel mehr mit den Schreibweisen vertraut machen. Eure Beispiele sind mir da (wie immer) eine große Hilfe, da ich bei Theorie doch immer sehr schwächle ....

Spart Zeilen, Variablen, ein komplettes Call-Center und schont so nicht-nichtwachsende Rohstoffe.

Danke!
Markus
BigWim
BigWim 11.03.2011 um 08:28:55 Uhr
Goto Top
Moin Bastla,

das wäre aber ein Nachteil, der evtl. zu vernachlässigen wäre, wenn ich dadurch mehr Vorteile hätte.

Letztendlich machen wir ja (vorerst) nichts anderes, als die Ausgabedatei zu öffnen, den String zu kopieren und in die Notesmail einfügen.
Das ich drei Gruppen habe und dennoch nur eine Mail, würde ich jetzt erst einmal als Sonderfall betrachten und da kann man doch auch mal erwarten, dass der Admin, ein Komma setzt und einmal auf Entfernen drückt (pro Zeile natürlich).

Ich habe soviel Futter, der Freitag ist gerettet .... wenn sich der Chef ruhig verhält face-wink

Grüße
Markus
BigWim
BigWim 11.03.2011 um 08:36:31 Uhr
Goto Top
Moin jeb,

"echo on" habe ich hier auch schon gelernt - auch die Anleitung von Timobeil face-wink

Ich habe auch schon einige probiert und Du glaubst gar nicht, wieviel Leerzeichen mal unabsichtlich erzeugen kann ...

Vielen Dank für die vielen Beispiele. Das eine gewisse Reihenfolge bei den Umleitungen ausschlagend ist, habe ich vermutet, aber nicht ableiten können. Auch sehe ich oft, die Schreibweisen mit "", obwohl es in meinen Scripten bisher auch ohne geht (Ausgabename Blanks im Pfad).

Werde Deine Beispiele auf jeden Fall "studieren"

Danke!
Markus