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, 4492 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 ..
Ähnliche Inhalte
C und C++
gelöst C++ andere EXE aufrufen, Probleme mit Leerzeichen im Pfad (14)

Frage von pablovic zum Thema C und C ...

Batch & Shell
gelöst Schreiben eines Strings mit Leerzeichen in eine Datei (6)

Frage von c20082005 zum Thema Batch & Shell ...

Ubuntu
gelöst Wie kann man es tun? Alle Zeilen mit 2 und mehr Leerzeichen entfernen (1)

Frage von takitano zum Thema Ubuntu ...

Webbrowser
gelöst Woher lädt diese Seite ihren Content? (8)

Frage von Aicher1998 zum Thema Webbrowser ...

Neue Wissensbeiträge
Windows 10

Windows 8.x oder 10 Lizenz-Key aus dem ROM auslesen mit Linux

(6)

Tipp von Lochkartenstanzer zum Thema Windows 10 ...

Tipps & Tricks

Wie Hackt man sich am besten in ein Computernetzwerk ein

(38)

Erfahrungsbericht von Herbrich19 zum Thema Tipps & Tricks ...

Heiß diskutierte Inhalte
Festplatten, SSD, Raid
POS Hardware und alternativen zu Raid 1? (21)

Frage von Brotkasten zum Thema Festplatten, SSD, Raid ...

Windows 10
gelöst Windows 10 Home "Netzlaufwerk nicht bereit" (19)

Frage von Oggy01 zum Thema Windows 10 ...

Viren und Trojaner
Verschlüsselungstrojaner simulieren (18)

Frage von AlbertMinrich zum Thema Viren und Trojaner ...

Exchange Server
Exchange Postfach leeren - nicht löschen (11)

Frage von AndreasOC zum Thema Exchange Server ...