rique1me
Goto Top

BATCH - Dateien umbenennen und mit SUBINACL Rechte vergeben!

So habe nun von meinen Ausbilder eine neue Aufgabe bekommen.
Hoffe Ihr könnt mir da ein wenig helfen.

Ich habe nun die Aufgabe bekommen, ein Skript zu schreiben, was Dateien sortiert.

Das heißt ich habe einen Ordner mit verschiedenen Dateien:

Text1.txt
Text2.txt
...
Bild1.bmp
Bild2.bmp
...
Pro1.exe
Pro2.exe
...

Nun soll das Skript die Dateien in verschiedene Ordner auf ein Netzlaufwerk kopieren.
So sollen zum Beispiel die Text-Dateien in ein Ordner txt, die bilder in bmp usw.
Die Ordner sollen immer an Hand der Endung (exe, txt usw) erstellt werden.

Wenn das alles klappt soll ich irgendwie mit SUBINACL die Rechte soeinstellen,
das zwei weitere User aus unserer Domäne auf meine Ordner vollen Zugriff haben.

Hoffe ihr könnt mir helfen.

Content-Key: 99304

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

Printed on: April 19, 2024 at 12:04 o'clock

Member: bastla
bastla Oct 15, 2008 at 07:39:34 (UTC)
Goto Top
Hallo rique1me!
Hoffe ihr könnt mir helfen.
Das wird ziemlich sicher so sein - allerdings sollst ja Du die Ausbildung machen, daher poste bitte einmal Deinen bisherigen Entwurf.

Tipp: Sieh Dir mit "for /?" (oder über "Start / Hilfe und Support / Suchen: for") einmal die Hilfe zur "for"-Schleife genau an ...

Grüße
bastla
Member: rique1me
rique1me Oct 15, 2008 at 08:07:42 (UTC)
Goto Top
Skript kann ich ja halbwegs aber ich weiß nicht wie ich das subinacl einbauen kann
Member: an-wei
an-wei Oct 15, 2008 at 08:19:41 (UTC)
Goto Top
dann solltest du mal 'etwas' im netz stoebern. dann findest du zb diverse seiten, wie diese eine oder diese andere hier.
auch soll man es kaum glauben, selbst microsoft hat was im angebot.

und hier im forum wirst du garantiert auch fuendig, wenn du danach suchst.
spass bei seite... finden tut man ueberall eine ganze menge, wenn man will und sich auch die arbeit macht will.

gruesse
andré
Member: rique1me
rique1me Oct 15, 2008 at 08:56:29 (UTC)
Goto Top
na gut aber wie bekomm ich das hin, dass die datei selbstständig die endungen (txt, bmp usw) herausfindet und dementsprechend ordner erstellt?

komm da echt nicht drauf und hab in der richtung nix gefunden
Member: rique1me
rique1me Oct 15, 2008 at 10:45:11 (UTC)
Goto Top
ich könnte da echt hilfe gebrauchen
komm hier net weiter
Member: bastla
bastla Oct 15, 2008 at 11:18:49 (UTC)
Goto Top
Hallo rique1me!

Konkret: An welcher Stelle kommst Du nicht weiter - bis jetzt ist noch nichts von Deinen Bemühungen zu sehen.

Vielleicht sollte ich Dir einen Tipp geben (oder habe ich das schon? face-wink) ...

Grüße
bastla
Member: rique1me
rique1me Oct 15, 2008 at 11:45:17 (UTC)
Goto Top
das hab ich :
sry das mit der formatierung bekomm ich net hin


@echo off

:Start
REM ~~~~~Variable deklarieren~~~~~
set suf=
set /p suf=Geben Sie die Endung der zu kopierenden Datei(en) an!
:Pfad
set pfad=
set /p pfad=Geben Sie den Pfad der zu kopierenden Datei(en) an!
cd %pfad%

if "%errorlevel%"=="0" (
goto :Next
) else (
echo Der angegebene Pfad konnte nicht gefunden werden!
goto :Pfad
)

:Next
REM ~~~~~Sucht nach dem passenden Verzeichnis mit der entsprechenden Endung~~~~~~
REM ~~~~~Wird das Verzeichnis nicht gefunden, springt das Skript zu NeuerOrdner%suf%~~~~~

:xcopy
REM ~~~~~Hier wird der Xcopy-Befehl durchgeführt~~~~~
xcopy /y *.%suf% w:\ordner\%suf%\
echo Kopieren beendet!
goto :ask

:NeuerOrdner
echo Ornder "%suf%" wird erstellt!
REM ~~~~~Ein Ordner mit der entsprechenden Endung wird erstellt~~~~~
mkdir w:\ordner\%suf%
REM ~~~~~Meldung wird ausgegeben, dass der Ordner erstellt wurde~~~~~
echo Ordner "%suf%" erstellt!
goto :xcopy

:ask
set ask=
set /p ask=Wollen Sie weitere Datei(en) kopieren? (J/N)
if /i "%ask%"=="j" (
goto :Start
)
if /i "%ask%"=="n" (
goto :eof
) else (
echo Falsche Eingabe!
goto :ask
)

oben habe ich das mit der eingabe gemacht.

aber ich will eigentlich, dass sich das skript die variable selber ausliest.
das heißt ohne abfrage.
er soll von selbst in den angegeben ordner nach inhalt suchen und die gefunden endungen als variable speichern.
Member: miniversum
miniversum Oct 15, 2008 at 18:37:47 (UTC)
Goto Top
Ok etwas mehr Hilfe gebe ich dir jetzt noch.
Der Ablauf kann so aussehen:
1. Schau im Ordner nach welche Dateien dort sind.
Tip hier:Das Dir mit parameter /b gibt dir eine Direkte liste mit den Dateinamen.
2. Diese Dateiliste gehst du einzeln nach einander durch, schaust welche endung sie haben, erstllst einen entsprechenden Ordner und verschiebst die Dateien.
Tip hier: Das durchgehen der Einzelnen dateien geht mit der For-Schleife. Das herausfinden wie die endung einer Datei ist ist ebenfalls in der Hilfe des Forbefehls beschrieben. Ist zwar ein verhältnissmäsig langer text, aber es lohnt sich zu wissen was For alles kann, auch für später.
Noch mehr und deutlichere Hilfe wäre dann zu leicht.
Member: Biber
Biber Oct 15, 2008 at 19:47:46 (UTC)
Goto Top
Moin rique1me,

eine Variation von miniversums Vorgehen wäre, das Prüfen und ggf. Anlegen der Ordner in einer eigenen Schleifenkonstruktion anzugehen.
Und erst in einer zweiten Runde alle Dateien in die richtigen Ordner zu verschieben mit einer Schleife über alle Dateien..
Denn (auch wenn mein Krusch-Ordner sicherlich nicht der Maßstab sein sollte) bei mir habe ich vielleicht 400 Dateien im Ordner mit vielleicht 30 verschiedenen Endungen. Worum sollte ich also bei jeder Datei, also 400x einen Ordner auf Existenz prüfen und ggf. anlegen wollen?

Alle in einem vorhandenen unterschiedlichen Datei-Endungen kannst Du mit einer simplen Zeile vom Cmd-Prompt aus in eine Variable Allx (für "alle Extensions") bekommen.
[Vorher: "mode con cols=177 lines=77"]
setlocal enabledelayedexpansion&set "x="& @set "allx=."& for /f %i in ('dir /oe /a-d /b') do @if /i "!x!" neq "%~xi" (set "x=%~xi"&set "allx=!allx!%~xi")  
### Danach steht in der Variablen %allx% siehe nächsten 2 Zeilen ###
>set allx
allx=..asc.bat.cmd.csv.doc.exe.gif.gz.hugo.inf.ini.jpg.js.kmp.log.lst.m3u.mdb.mov.nix.out.pdb.pdf.pkb.ppd.prc.ps1.pst.RCJ.reg.rtf.tif.tmp.txt.VBS.xls.zip
### Oder, so Du es zum Prüfen/Anlegen der Ordner brauchst:
>For %i in (%allx:.= %) do @if not exist %i\ echo md %i
md asc
md bat
md cmd
md csv
md doc
md exe
md gif
md gz
md hugo
md inf
md ini
md jpg
md js
md kmp
md log
md lst
md m3u
md mdb
md mov
md nix
md out
md pdb
md pdf
md pkb
md ppd
md prc
md ps1
md pst
md RCJ
md reg
md rtf
md tif
md tmp
md txt
md VBS
md xls
md zip

Also ist eigentlich mit 2 Zeilen schon die ganze Ordner-Sicherstellung abgefrühstückt.
....okay, man/frau könnte es auch in eine Zeile schreiben, ich weiss...

Das Sauberste (oder zumindest meine Strategie) wäre allerdings, nach dem Prüfen/Anlegen von "asc" auch gleich alle *.asc-Dateien mit zu verschieben... die Endung hab ich ja grad in der Hand...
For %i in (%allx:.= %) do @(if not exist %i\ echo md %i) & @echo move *.%i %i\
md asc
move *.asc asc\
md bat
move * bat bat\
md cmd
move *.cmd .cmd\
md csv
move * csv csv\
....
["echo" nur zum gefahrlosen Testen]

Grüße
Biber
[Edit] @bastla
bzw, da es ja eigentlich um's Kopieren ging, ...
Okay, dann sind mehrere Zeilen in der Tat überflüssiger Luxus, dann reicht eine.... *fg
[/Edit]
Member: bastla
bastla Oct 15, 2008 at 19:54:38 (UTC)
Goto Top
... bzw, da es ja eigentlich um's Kopieren ging, einfach "xcopy" verwenden, wodurch der Ordner bei Bedarf automatisch erstellt wird ...

Grüße
bastla

[Edit] @Biber
Oh, ein Pleonasmus - da muss ich mir bei geTuemII ein "hybsch" ausborgen ... face-wink
[/Edit]
Member: rique1me
rique1me Oct 16, 2008 at 05:38:49 (UTC)
Goto Top
und mit einer for schleife geht das nicht?

dir /b >"%pfad%pfadlog.txt"
FOR /F "eol=; tokens=2 delims=. " %%i in (%pfad%pfadlog.txt) do (
set suf=%%i
Member: bastla
bastla Oct 16, 2008 at 06:28:56 (UTC)
Goto Top
Hallo rique1me!

Doch, eine "for"-Schleife ist genau das, was Du brauchst. Was Du (falls es keine anderen Gründe dafür geben sollte) nicht brauchst, ist die Umleitung der "dir"-Ausgabe in eine Datei - daher:
for /f "tokens=2 delims=." %%i in ('dir /b') do set suf=%%i
Ein weiterer Hinweis: Durch
set suf=%%i
wird zwar bei jedem Schleifendurchlauf der jeweilige Typ in die Variable geschrieben, allerdings kannst Du auf den aktuellen Wert von %suf% innerhalb der Schleife nur zugreifen, wenn Du vorher mit
setlocal enabledelayedexpansion
die "verzögerte Variablenauflösung" aktiviert hast (anderenfalls wird nur zu Beginn der Schleife der Wert von %suf% ermittelt und immer in der Schleife verwendet). Dann musst Du den Variablennamen allerdings als !suf! (anstellen von %suf%) schreiben:
@echo off & setlocal enabledelayedexpansion
set suf=vor der Schleife gesetzt
for /f "tokens=2 delims=." %%i in ('dir /b') do (  
    set suf=%%i
    echo Nicht so:   %suf%
    echo sondern so: !suf!
)
Dein Ansatz hat übrigens eine uU gewichtige Einschränkung: Der Dateiname selbst darf keinen Punkt enthalten (Du verwendest ja durch "tokens=2 delims=." den Teil des Namens nach dem ersten und vor dem zweiten ".")! Du solltest Dir daher trotzdem noch genauer ansehen, was "for" noch zu bieten hat (in der Hilfe ziemlich am Ende, oder in Bibers Vorschlag oben).

Grüße
bastla

P.S.: Die Formatierung als "Code" ist nun aber wirklich nicht so schwierig: Mit < code> (ev Zusatz type="plain", um die Zeilennummern zu unterdrücken) kennzeichnest Du den Beginn eines Code-Blocks, und mit < /code> dessen Ende (in beiden Fällen ohne das Leerzeichen). Die Verwendung siehst Du auch, wenn Du für diesen Kommentar "mit Zitat" anklickst ...
Member: rique1me
rique1me Oct 16, 2008 at 10:20:27 (UTC)
Goto Top
So die Schleife funktioniert:


FOR /F "eol=; tokens=2 delims=. " %%i in (%pfad%pfadlog.txt) do @if not exist %%i\ (
md w:\test\%%i
@echo Ordner %ziel\%%i wurde erstellt!

jetzt muss ich nur noch die subinacl geschichte mit reinbringen und davon hab ich keine ahnung
Member: rique1me
rique1me Oct 16, 2008 at 13:19:56 (UTC)
Goto Top
wie kann ich dateien suchen ohne das ordner mitangezeigt werden

dir /b ???
Member: miniversum
miniversum Oct 16, 2008 at 17:35:43 (UTC)
Goto Top
Ja.
Du kannst ja alle Befehle gesondert an der MD testen. dan siehst Du was passiert. Bei Anzeigenden befehlen wir Dir ist das ja unproblematisch.
Member: Biber
Biber Oct 16, 2008 at 20:26:00 (UTC)
Goto Top
Moin rique1me,
Zitat von @rique1me:
wie kann ich dateien suchen ohne das ordner mitangezeigt werden

dir /b ???

und wenn ganz was Verrücktes ausprobieren magst, dann probier doch mal den
dir /oe /a-d /b
...-Befehl aus, den ich ein paar Dezimeter oberhalb extra für Dich breitgetreten habe.
Druckst Du eigentlich die Antworten auf Deine Fragen aus und benutzt die Rückseite für TicTacToe oder wie handhabst Du das hier mit dem Forum?

Grüße
Biber
aka der Ohne-Ende-Geduldige
Member: rique1me
rique1me Oct 17, 2008 at 05:32:45 (UTC)
Goto Top
Was meinst du damit biber?
Weiß jetzt nicht wo du hinaus willst?
Member: miniversum
miniversum Oct 17, 2008 at 09:30:52 (UTC)
Goto Top
Ich denke der liebe Biber will dir damit deutlich machen das er weiter oben (am 15.10.2008 um 21:47:46 Uhr) mehrere Zeilen Code gepostet hat. Lies diese Zeilen und versuche sie nachzuvollziehen wie sie funktionieren und was sie bewirken. Zu jedem darin enthaltenen Befehl bekommst du durch anfügen des Parameters /? die Hilfe angezeigt. Lies die Hilfe zu diesen Befehlen auch mal ganz durch. Auch was die Parameter bewirken. Damit sollten sich dann deine Fragen klären.

Die Methode in-der-Hilfe-des-Befehls-nachschauen-und-sehe-wofür-die-Parameter-gut-sind funktioniert zusammen mit der Methode ich-probier-die-einzelnen-Befehle-einfach-mal-aus meistens recht gut, nicht nur bei den oben verwendeten Befehle, sondern auch bei sehr vielen Anderen.