diemilz
Goto Top

Per Batch Benutzer-Homeverzeichnis für PDF-Drucker auslesen und in Variable speichern

Ich habe bei uns einen PDF-Drucker im Netzwerk eingerichtet (basierend auf dem Eintrag unter https://www.administrator.de/index.php?content=115210), allerdings sollen die Dateien ins Homeverzeichnis des Benutzers reinkopiert werden.

Servus,

ich hät da gern mal ein Problem. Ich bin anscheinend zu blöd fürs Skripting oder was weiß ich und brauche dabei Hilfe. Ich habe einen Ghostscript PDF-Drucker bei uns im Netz eingerichtet und für zwei Kategorien eingerichtet, Lehrer und Schüler. Die erstellten PDF-Dokumente sollen ins Homeverzeichnis in den Unterordner "PDF" des zu druckenden Users reinkopiert werden. Bei den Lehrern ist es ganz einfach, da deren Homeverzeichnisse unter einem Verzeichnis liegen, nämlich D:\Daten\Lehrer\Home. Bei den Schülern ist es komplexer, da die in Klassen aufgeteilt sind und die Daten dementsprechend verteilt sind, z.B. D:\Daten\Schueler\Home\Klasse1, D:\Daten\Schueler\Home\Klasse2, D:\Daten\Schueler\Home\Klasse3... und darunter befinden sich die Home-Verzeichnisse der jeweiligen Schüler. Der Drucker arbeitet im Hintergrund mit einen Batchscript. Ich lege mal unsere Fassung der Lehrer mit bei.

set USER=%REDMON_USER%
set TITLE=%REDMON_DOCNAME:/=_%
set TITLE=%TITLE:\=_%
set TITLE=%TITLE::=_%
if not exist d:\Daten\Lehrer\Home\%user%\PDF mkdir d:\Daten\Lehrer\Home\%user%\PDF
c:\Programme\gs\gs8.64\bin\gswin32c.exe -q -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -dNOSAFER -dAutoRotatePages=/PageByPage -dPDFSETTINGS=/prepress -dCompatibilityLevel=1.4 -sOutputFile="%1.pdf" %1  
set filename=%DATE:~6,4%_%DATE:~3,2%_%DATE:~0,2%-%user%_%random%
move %1.pdf d:\daten\lehrer\home\%user%\PDF\%filename%.pdf

Weiß jemand, wie ich das lösen kann? Ich wäre für jede Hilfe dankbar. Mein Ansatz war, mit dem Befehl
dir D:\Daten\Schüler\Home /s /b /a:d | find "//Name des Benutzers//"  
das Verzeichnis auszulesen und in einer Variable zu speichern, aber das dauert ewig lange, bis er da etwas gefunden hat. Außerdem kriege ich es nicht gebacken, diese Ausgabe in eine Variable zu speichern.

Content-Key: 124648

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

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

Mitglied: 81825
81825 Sep 10, 2009 at 11:17:28 (UTC)
Goto Top
Hallo,

kannst du die Umgebungsvariablen des Users

LOGONSERVER
HOMEDRIVE
HOMEPATH
USERNAME

nicht benutzen?
Member: diemilz
diemilz Sep 10, 2009 at 11:57:50 (UTC)
Goto Top
Das habe ich schon probiert. Das Druckerskript wird auf dem Server ausgeführt. Ich habe das schon probiert, aber die Datei wird nicht verschoben. Das Programm "redrun", was dazu benutzt wird, die PDF-Erstellung zu initiieren, bringt einen Stapel eigene Variablen mit, aber nicht die Gruppenzugehörigkeit. Meine Idee ist es, im Skript selbst die Gruppenzugehörigkeit des Benutzers (Variable %REDMON_USER%) herauszukriegen und dann die Datei in den entsprechenden Pfad zu verschieben. Aber wie kriege ich das raus?
Mitglied: 81825
81825 Sep 10, 2009 at 12:14:20 (UTC)
Goto Top
Tut mir leid, ich kenne weder das Programm noch bin ich firm in Server-Strukturen.

Aber für dein Script hätte ich eine etwas beschleunigte Lösung:

chcp 1252
pushd R:\Daten\Schüler\Home{\und evtl noch die Klasse}
for /F %%a in ('dir /ad /b  ^|find /i "Name des Benutzers"') do set "wasweissich=%%a"   
popd
chcp 850

In der Variablen wasweissich sollte dann der gewünschte Name stehen, wenn er denn gefunden wurde. face-wink

Die Codepage musst du wegen der Umlaute wechseln, wenn du das Script mit Notepad oder einem anderen Editor schreibst.
Wenn du dafür edit.com nutzt, kannst du die chcp weglassen.

Nur zur Info: dir /B fängt in Verbindung mit dem Parameter /S im Root des Laufwerks an, auch ohne die nicht gewünschten Ergebnisse anzuzeigen. Deshalb dauert das auch entsprechend lange. Wenn du in das zu durchsuchende Verzeichnis wechselst, kannst du nur /b verwenden und /S weglassen.

Edit 21:15 Uhr Fehlerhafte Zeile korrigiert.
Mitglied: 60730
60730 Sep 10, 2009 at 12:19:23 (UTC)
Goto Top
Servus,

bevor ich dir einen Tipp gebe- den du eigentlich suchst...

Mir scheint es etwas komplex und nicht ganz banal zu sein...

Bleibt ein Schüler sitzen, dann mußt du dessen Klasse ja auch irgendwo ändern.

Von daher würde ich eine textdatei auf dem Server hinterlegen, wo:

klasse1 Hans.Dampf
klasse2 Lisa.Loch
drinsteht und diese .txt dann auswerten...

Das hilft dir dann nicht nur für dieses Problem weiter...

Gruß
Member: St-Andreas
St-Andreas Sep 10, 2009 at 12:28:10 (UTC)
Goto Top
Hallo,

versteh ich das richtig, das Script wird nicht im jeweiligen Benutzerkontext ausgeführt? Und das homeverzeichnis des entsprechenden Benutzers wird wo genau definiert (vermute mal im AD?)?

Falls dem so wäre, wäre mein Ansatz einfach das HomeDir des Benutzers aus dem AD auszulesen....
Mitglied: 81825
81825 Sep 10, 2009 at 12:38:11 (UTC)
Goto Top
Guten Morgen. Guck man nach weiter oben. face-big-smile
Member: diemilz
diemilz Sep 10, 2009 at 12:41:04 (UTC)
Goto Top
Das Home-Verzeichnis zieht der Server sich wahrscheinlich aus der Variable %homeshare%, welches wiederum im Active Directory als Basisordner festgelegt ist.

Als Programm verwende ich FreePDF XP zusammen mit der aktuellsten Ghostskript-Version und einem angepassten Skript (siehe oben) unter http://freepdfxp.de/fpxpfaq/Netzwerkdrucker.htm.

Dass bei Schülern, die sitzenbleiben, die Klasse geändert werden muss, weiß ich. Deshalb wäre es mir ja am liebsten, entweder den Ordner zu suchen (der wird ja bei jedem neu erstellten PDF durchsucht) oder aber den Basisordner aus dem Active-Directory zu benutzen. Die Frage ist, wie lese ich den Basisordner per Batch aus?

Das mit der einfachen Skript-Variante werde ich mal probieren, aber was bedeuten dabei "popd" und "pushd"?
Mitglied: 81825
81825 Sep 10, 2009 at 12:45:46 (UTC)
Goto Top
Die Frage nach der Bedeutung beantwortet dir umfassend die entsprechende Hilfe zu jedem Befehl in der Eingabeaufforderung. face-wink
help befehl
oder
befehl /?
Member: St-Andreas
St-Andreas Sep 10, 2009 at 16:53:46 (UTC)
Goto Top
Du weisst aber schon, dass wenn das Skript nicht im Benutzerkontext ausgeführt wird die von Dir erwähnten Variablen nicht dahin zeigen wohin sie sollten?

face-smile
Member: diemilz
diemilz Sep 10, 2009 at 17:02:29 (UTC)
Goto Top
Richtig. Deshalb bleiben mir nur die zwei Möglichkeiten, entweder über die Gruppenmitgliedschaft oder über das Suchen von Verzeichnissen. Ersteres ist mir lieber, weil die Erstellung dann relativ schnell abgeht, aber ich weiß nicht, wie ich das umsetzen kann. Deshalb bleibt mir nur das Suchen der entsprechenden Verzeichnisse.
Mitglied: 81825
81825 Sep 10, 2009 at 18:27:09 (UTC)
Goto Top
@andreas#S
Ja, weiß ich. Trotzdem wurde die Frage schon gestellt und beantwortet. face-wink
Member: St-Andreas
St-Andreas Sep 10, 2009 at 18:36:31 (UTC)
Goto Top
ifmember.exe ist dann Dein Freund, bzw. ich würde einfach die passenden Attribute aus dem AD auslesen lassen.
Mache das nicht allzu häufig, daher kann ich da jetzt nichts genaueres zu sagen ich kann aber mal www.selfadsi.de empfehlen..

@81825
Könnte sein das meine Leitung im Augenblick noch länger ist als ohnehin üblich ... hab zuviel Freizeit....
Mitglied: 60730
60730 Sep 10, 2009 at 18:41:35 (UTC)
Goto Top
Zitat von @81825:
Guten Morgen. Guck man nach weiter oben. face-big-smile

Yupp
05. if not exist d:\Daten\Lehrer\Home\%user%\PDF mkdir d:\Daten\Lehrer\Home\%user%\PDF

mit dieser Zeile wird immer ein Verzeichnis d:\Daten\Lehrer\Home\%user%\PDF erstellt - egal ob das nun ein Lehrer oder Schüler ist.

Von daher müßte man den ganzen Kladderadatsch eh etwas neu schreiben.

Immer frei nach dem Motto - einer (Script) für alle (Fälle)

05. if exist d:\Daten\Lehrer\Home\%user% if not exist d:\Daten\Lehrer\Home\%user%\PDF mkdir d:\Daten\Lehrer\Home\%user%\PDF
wäre schonmal ein Anfang face-wink

So mein Kindlein muß nun gewickelt werden..

Gruß
Member: St-Andreas
St-Andreas Sep 10, 2009 at 18:45:32 (UTC)
Goto Top
Na klasse! Das Geschrei von Deinem hat offenbar meines geweckt!!!
Mitglied: 81825
81825 Sep 10, 2009 at 18:52:51 (UTC)
Goto Top
*ROFL*
Mitglied: 81825
81825 Sep 10, 2009 at 18:56:17 (UTC)
Goto Top
Der Scriptschnipsel, den dich dir gepostet hatte, hat leider einen Fehler: Er funktioniert nur, wenn der gesuchte Benutzername auch als Verzeichnis existiert.

Nimm lieber den:

set wasweissich=
chcp 1252
pushd R:\Daten\Schüler\Home{\und evtl noch die Klasse} 
for /F %%a in ('dir /ad /b  ^|find /i "Name des Benutzers"') do set "wasweissich=%%a"  
popd
chcp 850
Member: diemilz
diemilz Sep 10, 2009 at 20:11:42 (UTC)
Goto Top
Das ist zwar korrekt, aber nicht das was ich suche. Das Skript von mir oben ist die Fassung für die Lehrer. Die funktioniert so einwandfrei, eben weil alle Home-Verzeichnisse der Lehrer unter D:\Daten\Lehrer\Home liegen. Die Home-Verzeichnisse der Schüler liegen unter D:\Daten\Schüler\Home\<Klassenname>\<Benutzername> und da kann ich das Skript nun mal nicht verwenden. Die Lösung mit der For-Schleife scheint dabei wohl am ehesten zu funktionieren. Das werde ich morgen gleich mal austesten.
Member: diemilz
diemilz Sep 10, 2009 at 20:12:25 (UTC)
Goto Top
Das werde ich morgen gleich mal checken, das sieht doch gut aus. Vielen Dank schonmal, ich melde mich, sobald es funktioniert (oder auch nicht ;) ). face-smile
Mitglied: 60730
60730 Sep 10, 2009 at 20:36:30 (UTC)
Goto Top
Zitat von @St-Andreas:
Na klasse! Das Geschrei von Deinem hat offenbar meines geweckt!!!

Mein Kindlein schreit nicht - es kräht (noch) face-wink

Zitat von @diemilz:
Das ist zwar korrekt, aber nicht das was ich suche.
sorry, aber wenn ich lese - du brauchst Hilfe beim scripten - dann ist der Tipp ein Script für alle schon das, was du brauchst - egal ob du nun danach gesucht hast - oder nicht.

Das Skript von mir oben ist die Fassung für die Lehrer. Die funktioniert so
einwandfrei, eben weil alle Home-Verzeichnisse der Lehrer unter
D:\Daten\Lehrer\Home liegen. Die Home-Verzeichnisse der Schüler
liegen unter
D:\Daten\Schüler\Home\<Klassenname>\<Benutzername>
und da kann ich das Skript nun mal nicht verwenden.

ok -nochmal und wirklich sehe das als konstruktive Kritik...

Du hast eine Struktur:

  • "Schüler" mit umlauten
  • darunter dann Klassen
  • darin die einzelnen Schüler....

Also mußt du am Ende des Schuljahres..

  • - alle Schüler im Ordner \schüler\klasse10a löschen - oder den Ordner komplett
  • - alle Schüler aus Klasse 9a in Ordner 10a verschieben - oder den Ordner umbenamsen
  • - das gleiche für alle Klassen - von oben (10) nach unten (5)

Wenn es keinen dringenden Grund gibt, die Schüler in Klassen auf dem Home zusammenzufassen, würde ich mir das nicht antun wollen.
Da sind Fehler ja vorprogrammiert.

Die Lösung mit der For-Schleife scheint dabei wohl am ehesten zu funktionieren.
Die Frage ist wirklich - macht der ganze Towuhabohu mit den Klassen wirklich Sinn?

Gruß
Member: diemilz
diemilz Sep 11, 2009 at 05:47:23 (UTC)
Goto Top
Es hat leider nicht funktioniert. Ich habe auch ein Protokoll erstellen lassen während des Drucks, aber auch das ist ohne Fehler. Langsam verzweifel ich an meinem Verstand. Oder wisst ihr, wo der Fehler im Skript liegt?

set USER=%REDMON_USER%
set TITLE=%REDMON_DOCNAME:/=_%
set TITLE=%TITLE:\=_%
set TITLE=%TITLE::=_%
set pdfpath=

c:\Programme\gs\gs8.64\bin\gswin32c.exe -q -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -dNOSAFER -dAutoRotatePages=/PageByPage -dPDFSETTINGS=/prepress -dCompatibilityLevel=1.4 -sOutputFile="%1.pdf" %1  
set filename=%DATE:~6,4%_%DATE:~3,2%_%DATE:~0,2%-%time:~0,2%_%time:~3,2%
chcp 1252
pushd D:\Daten\Schueler\Home
for /f %%a in ('dir /a:d /b ^|find /i %REDMON_USER%') do set "pdfpath=%%a"  
popd
chcp 850
if not exist %pdfpath%\PDF mkdir %pdfpath%\PDF
move %1.pdf %pdfpath%\PDF\%filename%.pdf
Member: diemilz
diemilz Sep 11, 2009 at 06:14:33 (UTC)
Goto Top
Hab den Fehler selbst gefunden, ich hatte beim dir-Befehl den Parameter /s vergessen. Jetzt legt er brav das Verzeichnis an, aber ich habe noch ein kleines Problem. Die For-Schleife legt die Variable dreimal neu an, bis sie zum Schluss so aussieht:
D:\Daten\Schüler\Home\<Klassenname>\<Schülername>\PDF\PDF

Unterm Strich legt er jedes Mal bei der Erstellung einer PDF-Datei erstmal einen neuen Unterordner "PDF" im Schülerordner an. Drucke ich also 10 PDFs, dann sieht der Pfad am Schluss so aus: D:\Daten\Schueler\Home\<Klassenname>\<Schülername>\PDF\PDF\PDF\PDF\PDF\PDF\PDF\PDF\PDF\PDF.

Hier mal das aktuellste Protokoll. Das Skript ist das Gleiche wie oben, nur mit dem Parameter /s im Dir-Befehl und mit einer modifizierten Filename-Variable.

C:\Windows\system32>set USER=test_it2008 

C:\Windows\system32>set TITLE=Testseite 

C:\Windows\system32>set TITLE=Testseite 

C:\Windows\system32>set TITLE=Testseite 

C:\Windows\system32>set pdfpath= 

C:\Windows\system32>c:\Programme\gs\gs8.64\bin\gswin32c.exe -q -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -dNOSAFER -dAutoRotatePages=/PageByPage -dPDFSETTINGS=/prepress -dCompatibilityLevel=1.4 -sOutputFile=""c:\windows\temp\reda17480".pdf" "c:\windows\temp\reda17480"   
%%[ ProductName: GPL Ghostscript ]%%
%%[Page: 1]%%
%%[LastPage]%%

C:\Windows\system32>set filename=2009_09_11-test_it2008_32071 

C:\Windows\system32>chcp 1252 
Aktive Codepage: 1252.

C:\Windows\system32>pushd D:\Daten\Schueler\Home 

D:\Daten\Schueler\home>for /F %a in ('dir /a:d /s /b | find /i "test_it2008"') do set "pdfpath=%a"   

D:\Daten\Schueler\home>set "pdfpath=D:\Daten\Schueler\home\IT2008\test_it2008"   

D:\Daten\Schueler\home>set "pdfpath=D:\Daten\Schueler\home\IT2008\test_it2008\PDF"   

D:\Daten\Schueler\home>set "pdfpath=D:\Daten\Schueler\home\IT2008\test_it2008\PDF\PDF"   

D:\Daten\Schueler\home>popd

C:\Windows\System32>chcp 850 
Aktive Codepage: 850.

C:\Windows\System32>if not exist D:\Daten\Schueler\home\IT2008\test_it2008\PDF\PDF\PDF mkdir D:\Daten\Schueler\home\IT2008\test_it2008\PDF\PDF\PDF 

C:\Windows\System32>echo D:\Daten\Schueler\home\IT2008\test_it2008\PDF\PDF 
D:\Daten\Schueler\home\IT2008\test_it2008\PDF\PDF

C:\Windows\System32>move "c:\windows\temp\reda17480".pdf D:\Daten\Schueler\home\IT2008\test_it2008\PDF\PDF\PDF\2009_09_11-test_it2008_32071.pdf   
        1 Datei(en) verschoben.
Mitglied: 81825
81825 Sep 11, 2009 at 07:11:17 (UTC)
Goto Top
Zitat von @diemilz:
Hab den Fehler selbst gefunden,

Nö. face-smile

ich hatte beim dir-Befehl den Parameter /s vergessen.

Der Parameter /s arbeitet rekursiv, d. h. er legt auch deshalb das Verzeichnis mehrfach an. /S darfst du nicht verwenden.
Du hast ganz einfach das Verzeichnis, das er durchsuchen soll, falsch definiert und "IT2008" vergessen. face-wink
Member: diemilz
diemilz Sep 11, 2009 at 09:37:07 (UTC)
Goto Top
Nein, das geht aber nicht, dann müsste ich für jede Klasse nen eigenen PDF-Drucker auf dem Server anlegen und das ist mir zu viel Aufwand. Geht das denn nicht noch anders?

Ohne den Parameter /s bekomme ich das Verzeichnis nicht angelegt und damit auch die Datei nicht kopiert.
Mitglied: 81825
81825 Sep 11, 2009, updated at Oct 18, 2012 at 16:39:18 (UTC)
Goto Top
Warum folgst du nicht dem Vorschlag, den TimoBeil dir hier gemacht hat?
Die Liste kannst du doch einfach erzeugen.
dir /a:d /s /b Pfad > irgendeinname.txt
Member: St-Andreas
St-Andreas Sep 11, 2009 at 09:51:52 (UTC)
Goto Top
Ich mische mich ja nur ungern in sowas ein, aber wäre das Abfragen des homedrives für den User per dsget user -hmdir (siehe auch http://technet.microsoft.com/en-us/library/cc732535%28WS.10%29.aspx ) nicht irgendwie einfacher?
Member: diemilz
diemilz Sep 11, 2009 at 09:53:20 (UTC)
Goto Top
Das ist mir zu umständlich, dann muss ich zwei Datenbestände pflegen. Wäre zwar interessant, aber mir zu umständlich. Es muss doch auch so irgendwie gehen. Wie kann ich denn die letzten vier Zeichen einer Variable wegschneiden in Batch?
Mitglied: 81825
81825 Sep 11, 2009 at 10:01:41 (UTC)
Goto Top
Ich mische mich ja nur ungern in sowas ein,

Das wäre ein Fehler, sich nicht einzumischen face-wink

..... nicht irgendwie einfacher?

Garantiert. Und deshalb klinke ich mich auch aus.

Zum Abschluss noch ein informativer Link:
Mitglied: 60730
60730 Sep 11, 2009 at 10:40:27 (UTC)
Goto Top
Zitat von @diemilz:
Das ist mir zu umständlich, dann muss ich zwei Datenbestände pflegen.

Zitat von @diemilz:
Das ist zwar korrekt, aber nicht das was ich suche. Das Skript von mir
oben ist die Fassung für die Lehrer.

Zitat :
Immer frei nach dem Motto - einer (Script) für alle (Fälle)

Nehme ich dann zurück und behaupte einmal richtig gemacht - immer funktionierend.

Du willst nicht zwei Datenbestände pflegen, aber zwei Bätche für (fast) das gleiche sind ok.

Zitat von @81825:
Garantiert. Und deshalb klinke ich mich auch aus.

dito.
Member: diemilz
diemilz Sep 11, 2009 at 11:43:11 (UTC)
Goto Top
Hach ja, ich kann manchmal wirklich blöd sein. :D

Ich habs jetzt mit ner Sprungmarke gelöst. Ist zwar nicht das Gelbe vom Ei, da ich nur ungerne mit Sprungmarken arbeite, aber jetzt funktioniert es. Das Skript sieht jetzt so aus:

set USER=%REDMON_USER%
set TITLE=%REDMON_DOCNAME:/=_%
set TITLE=%TITLE:\=_%
set TITLE=%TITLE::=_%

c:\Programme\gs\gs8.64\bin\gswin32c.exe -q -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -dNOSAFER -dAutoRotatePages=/PageByPage -dPDFSETTINGS=/prepress -dCompatibilityLevel=1.4 -sOutputFile="%1.pdf" %1  
set filename=%DATE:~6,4%_%DATE:~3,2%_%DATE:~0,2%-%user%_%random%
chcp 1252
pushd D:\Daten\Schueler\Home
for /f %%a in ('dir /a:d /s /b ^| find /i "%REDMON_USER%"') do (  
set pdfpath=%%a
goto common
)

:common
popd
chcp 850
if not exist %pdfpath%\PDF mkdir %pdfpath%\PDF
echo %pdfpath%
move %1.pdf %pdfpath%\PDF\%filename%.pdf

Sry, dafür, dass ich mich manchmal unverständlich ausdrücke, ist keine Absicht gewesen. Trotzdem Danke nochmals für die vielen Tipps. Hier ists ja noch besser wie bei der 11880. :D