Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Woher kommt das Leerzeichen?

Frage Entwicklung Batch & Shell

Mitglied: BigWim

BigWim (Level 2) - Jetzt verbinden

10.03.2011, aktualisiert 12:06 Uhr, 4467 Aufrufe, 9 Kommentare

Hallo zusammen,

meine Erkenntnisse habe ich aus diesem SET-Tutorial.

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:
01.
@echo off & setlocal 
02.
 
03.
Set Gruppe=%1 
04.
set count=0 
05.
set tz= 
06.
set LogFile=%~n0.txt 
07.
 
08.
if /i "%2"=="NoDel" ( 
09.
	set count=2 
10.
) else ( 
11.
	if exist %Logfile% del %LogFile% 
12.
13.
 
14.
for /f "tokens=2 delims=,=" %%a in ('dsquery group -name "%Gruppe%" ^| dsget group -members') do call :Machwat %%a 
15.
goto :eof 
16.
 
17.
 
18.
:Machwat 
19.
Set Userid=%1 
20.
Set /A count+=1 
21.
 
22.
if %count% gtr 1 set tz=, 
23.
 
24.
echo.|set /p=%tz%%userid% 
25.
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
Mitglied: 76109
10.03.2011 um 14:56 Uhr
Hallo BigWim!

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

Gruß Dieter
Bitte warten ..
Mitglied: bastla
10.03.2011 um 14:58 Uhr
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
Bitte warten ..
Mitglied: BigWim
10.03.2011 um 15:37 Uhr
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

Vielen Dank!!!
Markus
Bitte warten ..
Mitglied: jeb-the-batcher
10.03.2011 um 21:16 Uhr
Hallo BigWim,

die Antwort findet man wie so oft mit echo on
01.
 
02.
echo on 
03.
<nul set /p .=AAA>> a.txt 
04.
set /p .=BBB<nul    >>a.txt 
05.
set /p .=CCC>>a.txt <nul  
06.
echo.|set /p .=DDD>> a.txt 
07.
echo.|set /p ".=EEE">> a.txt 
08.
<nul set /p .=FFF>> a.txt 
09.
echo.|set /p ".=GGG" xyzABC >> a.txt 
10.
---- Inhalt a.txt ---- 
11.
AAABBBCCC DDD EEEFFFGGG 
12.
 
13.
--- Ausgabe durch ECHO ON ---- 
14.
C:\temp>set /p .=AAA 0<nul 1>>a.txt 
15.
C:\temp>set /p .=BBB 0<nul 1>>a.txt 
16.
C:\temp>set /p .=CCC  1>>a.txt 0<nul 
17.
C:\temp>echo. | set /p .=DDD 1>>a.txt 
18.
C:\temp>echo. | set /p ".=EEE" 1>>a.txt 
19.
C:\temp>set /p .=FFF 0<nul 1>>a.txt 
20.
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
Bitte warten ..
Mitglied: Biber
10.03.2011 um 21:37 Uhr
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:
01.
@echo off & setlocal enabledelayedExpansion 
02.
 
03.
Set Gruppe=%1 
04.
Set "alles=" 
05.
set LogFile=%~n0.txt 
06.
 
07.
if /i "%2"=="NoDel" ( 
08.
	set count=2 
09.
) else ( 
10.
	if exist %Logfile% del %LogFile% 
11.
12.
 
13.
::for /f "tokens=2 delims=,=" %%a in ('dsquery group -name "%Gruppe%" ^| dsget group -members') do ( 
14.
REM STATT ('dsquery..." ) rufe ich zur Demo hier 'Net localgroup' als Beispiel 
15.
 
16.
for /f "tokens=1 delims=,=" %%a in ('net localgroup^|findstr /C:"*"') do ( 
17.
   If not defined Alles (set "Alles=%%a")  else Set "Alles=!Alles!,%%a" 
18.
 )         
19.
if defined Alles (  
20.
 echo %Alles% 
21.
 REM [wenn es ein logfile gibt-entREMen] echo %Alles%>>%LogFile% 
22.
23.
 
24.
goto :eof
Ist doch ein bisschen schlanker..... wie jetzt in dieser Zeit auch anzustreben ist.

Grüße
Biber
Bitte warten ..
Mitglied: bastla
10.03.2011 um 23:48 Uhr
@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
Bitte warten ..
Mitglied: BigWim
11.03.2011 um 08:26 Uhr
Moin Biber,

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

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
Bitte warten ..
Mitglied: BigWim
11.03.2011 um 08:28 Uhr
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

Grüße
Markus
Bitte warten ..
Mitglied: BigWim
11.03.2011 um 08:36 Uhr
Moin jeb,

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

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
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Microsoft Office
gelöst Dropdownlisten in Abhängigkeit mit Leerzeichen im Namen (Datenüberprüfung) (2)

Frage von kevische zum Thema Microsoft Office ...

Administrator.de Feedback
Bug? "m f g" (ohne Leerzeichen) wird auch in URL ersetzt (5)

Frage von emeriks zum Thema Administrator.de Feedback ...

Batch & Shell
Leerzeichen im Pfad (4)

Frage von Jallio zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (17)

Frage von liquidbase zum Thema Windows Update ...