Batch Script - Dateinamen zum Teil auslesen, Variable für Kopiervorgang benutzen

Touch3x

Cadet 1st Year
Registriert
Jan. 2023
Beiträge
10
Liebe Scriptler,
wir haben in unserem Unternehmen das Problem, dass in der Vergangenheit zu unseriös mit der FolderRedirection umgegangen wurde. So gibt es teilweise 2-3 Ordner pro Benutzer, obwohl es nur ein Homeshare geben sollte. Da es knapp 7000 Ordner sind, wollte ich ein Script für das ganze hin und her kopieren und auch das anschließende Löschen haben.
Meine Idee war es jetzt zwei Scripte zu schreiben.

Script 1 kopiert die Daten aus den Ordnern die zu viel sind in das richtige Homeshare, hier in dem Beispiel:
\\SHARE\USER\AppData\Roaming -> \\SHARE\USER.DOMAIN\AppData\Roaming
\\SHARE\USER.DOMAN -> \\SHARE\USER.DOMAIN\Dokumente
Beim Kopieren wird ein Log mit dem Namen USER-AppData oder Dokumente.log angelegt.

In dem Fall wurde Dokumente sogar direkt in Homeshare gelegt, was die Nachwirkung hat, dass der angezeigte Ordnername "Dokumente" ist und nicht USER.DOMAIN, sollte es hier noch eine Idee geben, gerne her damit.
Und nein, ein Rename funktioniert nicht über die CMD, da nur der Anzeigename "Dokumente" lautet, der Pfad aber USER.DOMAIN ist.

Script 2 soll den Dateinamen der Logs. nämlich die ersten 7 Stellen (Username) auslesen und als Variable weiterverwenden, um sodann als Admin die Ordner die "zu viel" sind, zu verschieben, damit der Ordner wieder aufgeräumt ist.

Zu Script 2 habe ich tatsächlich nicht allzu viele Ideen, außer, dass es wohl eine for-Schleife sein wird.

Idee ist, die Logs in ein temp Verzeichnis zu legen um diese dann mit dem Script zu verarbeiten und anschließend in ein Done-Verzeichnis zu schieben. Es sollen auch nur Logs älter 24h verarbeitet werden, damit sichergestellt ist, dass der Kopierprozess des Users schon abgeschlossen ist. Ebenfalls sollte es keine .log-Dateien <2kb behandeln, sondern löschen.


Ich hoffe ich konnte den Fall klar schildern und bedanke mich schon Mal für euer Wissen.

Liebe Grüße Tx
 
Zuletzt bearbeitet:
so ganz verstehe ich es grad nicht.

Warum kopierst du nicht einfach die gewünschten Daten von A nach B und löscht A nach erfolgreichem kopieren? Warum ein Umweg über n Logfile?

Bash:
xcopy "Pfad_des_Ordners_A" "Zielpfad_Ordner_B" /E /I /H

Falls während des kopierens Daten überschrieben werden müssten, was besttigt werden muss, kannst du noch /Y anhängen.

löschen kannst du den Ordner anschließend mit

Bash:
rmdir "Pfad_des_Ordners_A" /S /Q


komplett in etwa so
Bash:
set "Ordner_A=Pfad_des_Ordners_A"
set "Ordner_B=Zielpfad_Ordner_B"

xcopy "%Ordner_A%" "%Ordner_B%" /E /I /H /Y

rmdir "%Ordner_A%" /S /Q

oder, wenn du das Skript dynamisch aufrüfen möchtest, auch als Input Variable

Bash:
xcopy %1 %2 /E /I /H /Y
rmdir %1 /S /Q

Code:
script.bat "Pfad_des_Ordners_A" "Zielpfad_Ordner_B"
 
Wie kam/kommt es denn überhaupt zu dem Kuddelmuddel? Wurden die Verzeichnisse und Verweise denn nicht automatisch über Gruppenrichtlinie angelegt?
Eventuell müsste da ja erst mal für Ordnung gesorgt werden...

Ich werde kein fertiges Script liefern, erst recht nicht als Batch. Vielleicht kommen von mir noch Ansätze als Powershell...
PS hat u.A. den Vorteil, dass man auf alle Attribute der AD-User zugreifen und entsprechend auswerten kann. Könnte bei deinem Unterfangen relevant sein.
Je nachdem, wie die Situation entstanden ist, könnte es sogar sinnvoll sein, ein Script zu schreiben, welches im Userkontext läuft, da man da dann auch relevante Registrykeys auswerten kann.
 
@spcqike
Lieben Dank für deine erste Rückmeldung.
Der User hat keine Berechtigung zum Löschen der Ordner, somit muss dies über ein separates Skript als Administrator ausgeführt werden.
Der Administrator hat aber wiederum keine Berechtigung die Ordner und Dateien zu kopieren, da der User Exklusivzugriff hat.

@kartoffelpü
Lieben Dank auch Dir für deine Rückmeldung.
Das Skript für den Administrator kann auch gerne PS sein, die User können dies halt nur nicht ausführen, deshalb läuft der Kopiervorgang etc. im Anmeldeskript über ein Bash-Script.
Und ja, das Kuddelmuddel kommt von den GPOs, wo halt nicht sorgfältig geschaut wurde und verschiedene Pfade angegeben wurden. Dies wird natürlich bereinigt, allerdings benötige ich natürlich dazu erstmal ein funktionierendes Script zum Testen.
Der User ist halt sehr eingeschränkt was alle Berechtigungen angeht, selbst wir als Admins haben nicht alle Berechtigungen.
 
kartoffelpü schrieb:
Je nachdem, wie die Situation entstanden ist, könnte es sogar sinnvoll sein, ein Script zu schreiben, welches im Userkontext läuft, da man da dann auch relevante Registrykeys auswerten kann.
Und man auch nicht in falsch gesetzte ACLs läuft. Falls die nicht sauber vererbt wurden... Aber ggf. denke ich auch zu weit.

Alles in Allem würde ich eher über PS gehen. z.B. für die Log-Namen Geschichte: https://adamtheautomator.com/powershell-substring/
 
So, ich habe nun schon Mal ein Script welches die ganzen Vorarbeiten und auch Nacharbeiten macht in Powershell. Jetzt fehlt noch der Mittelteil. Das Auslesen das Dateinamens habe ich auch hinbekommen, allerdings nicht reduziert auf die ersten 7 Zeichen. Hier müsste dann noch die Variable für das Verschieben genutzt werden.

Code:
(Get-ChildItem $log -File -Recurse).Name
foreach ($item in $temp){
$matches=[regex]::Matches($content,'^')
if($matches)
{
echo echo
}
}

Wenn ich in dem if den SubString(0,7) hinzufüge, sagt er, dass er SubString nicht kennt.
Code:
{
$matches.SubString(0,7)
echo $matches
}



---


Okay, hab's.

Mit
Code:
(Get-ChildItem $log -File -Recurse).Name.SubString(0,7)

bekomme ich den Benutzernamen.
Wäre jetzt für die If-Anweisung notwendig zu sagen Move-Item ... %PFAD%\$matches\ -Path ... -Destination ...?
Oder würde man jetzt anders vorgehen? Hier legt er mir nämlich nur einen Ordner .DOMAIN an und nicht USER.DOMAIN und schiebt alle Files da rein, die natürlich separiert werden sollten.

Lg Tx
 
Zuletzt bearbeitet:
Hallo zusammen,
kann mir jemand bei dem Baustein helfen?

Code:
$users = (Get-ChildItem $log -File -Recurse).Name.SubString(0,7)
foreach($item in $users){
New-Item -Name "$user.DOMAIN" -ItemType Directory -Path $done
Move-Item -Path $temp\*.log -Destination "$done\$user.DOMAIN"
}

Leider versucht er hier alle vorhandenen Logdateien in alle Verzeichnisse zu kopieren.

Wo ist mein Fehler?

LG Tx


---


Gut, wenn man sich das Script anschaut, sieht man den Fehler auch 🤦‍♂️

Lg Tx
 
Zuletzt bearbeitet:
Zurück
Oben