tankwart04
Goto Top

Skript Ordnerinhalt kopieren

Hallo,

habe beim umbenennen auf dem Server einen Fehler gemacht, daher gibt es nun in vielen Ordnern den Ordner "BHV" und "BHV (1)"
Ich wollte dies mit einem Skript wieder korrigieren, leider bin ich auch mit der Software RenameMaster gescheitert.

Aus Sicherheitsgründen wollte ich ein Skript erstellen, welches auf dem Serverlaufwerk prüft, ob es den Ordner "BHV" gibt, wenn "Ja", dann die Dateien aus "BHV (1)" in Ordner "BHV" kopieren.
Die Dateien liegen beispielhaft: Z:\Projekte\01 (dieser Ordner sind aufsteigend) \Gewerbe\

Hat jemand vielleicht eine Idee und Vorschlag, wie ich das Skript korrekt schreiben kann?
Danke im Voraus

Gruß Mats

Content-Key: 581198

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

Printed on: April 26, 2024 at 22:04 o'clock

Member: erikro
erikro Jun 21, 2020 updated at 21:12:08 (UTC)
Goto Top
Moin,

zum Testen habe ich jetzt keine Lust mehr. face-wink Das Skript geht rekursiv alle Verzeichnisse durch und kopiert die Daten um. Funktioniert nicht, wenn in einem Ordner BHV(1) noch ein Ordner BHV(1) liegt. Dann muss das Skript mehrfach aufgerufen werden.

edit: bestehende Dateien werden überschrieben.

noch ein edit: Aufruf im Wurzelverzeichnis des Laufwerks (oder wo auch immer Du anfangen willst):

Pfad-zum-Skript . <-------Das ist ein Punkt! ;-)

PARAM (

        $dir

    )

    $subdirs = Get-ChildItem -Directory -Path $dir
    if($subdirs) {

        foreach($subdir in $subdirs) {
            if(-not (Test-Path "BHV")) {  

                    New-Item -ItemType directory -Name "BHV" -Path $subdir  

            }
            if($subdir.name -eq "BHV(1)") {  
                                
                $content_dirs = Get-ChildItem -Directory

                foreach($content_dir in $content_dirs) {

                    Copy-Item $content_dir -Destination "$subdir\BHV" -Recurse -Force  
                    Write-Output "$content_dir.fullpath nach $subdir.fullpath\BHV kopiert.\n"  

                }

            }
            search-recurse -dir $subdir    

        }
        
    }
    else {

        Write-Output "$subdir.fullpath hat keine Unterverzeichnisse\n"  

    }

}

hth

Erik
Member: rubberman
Solution rubberman Jun 21, 2020 at 21:08:59 (UTC)
Goto Top
Batch code:
@echo off &setlocal
set "rootfolder=Z:\Projekte"  

for /d %%i in ("%rootfolder%\*") do (  
  if exist "%%~i\Gewerbe\BHV" if exist "%%~i\Gewerbe\BHV (1)" (  
    robocopy "%%~i\Gewerbe\BHV (1)" "%%~i\Gewerbe\BHV" /e /r:0 /w:0  
  )
)

pause
Beachte: Kopieren ist nicht verschieben und erst recht nicht anschließend löschen face-wink Aber davon hattest du auch nichts geschrieben.

Steffen
Member: Tankwart04
Tankwart04 Jun 22, 2020 updated at 20:59:32 (UTC)
Goto Top
Hallo erikro und rubberman,

vielen Dank erstmal für Eure Hilfe, bereits jetzt habe ich aus beiden Befehlsabfolgen etwas gelernt.

In meiner Testumgebung ging der Code von rubberman unkompliziert.
Für das Serverlaufwerk läuft es weder von meinem Client mit Admin-Rechten oder auf dem Server als Admin selber.
Die Fehlermeldung lautet: "Der Befehl "`m" (das m ist als kryptisches Symbol dargestellt) ist entweder falsch geschrieben oder konnte nicht gefunden werden"
Habe das Skript auch als Admin ausgeführt

Muss ich hier mit dem Path-Befehl arbeiten?
Danke im Voraus
Mats

P.S. Ich habe einen Windows Server 2012R2
Member: rubberman
rubberman Jun 22, 2020 updated at 21:26:05 (UTC)
Goto Top
(das m ist als kryptisches Symbol dargestellt)
Lass mich raten, sieht so aus:
´╗┐
Falls ja, hast du das Script in UTF-8 mit BOM gespeichert. Was du siehst ist das BOM wie es in Codepage 850 dargestellt wird.
https://de.wikipedia.org/wiki/Byte_Order_Mark

Öffne das Script mit dem Windows Editor (notepad.exe) -> Speichern unter -> Wähle im Dropdown von Codierung "ANSI" aus -> Speichern (überschreiben).

Steffen
Member: Tankwart04
Tankwart04 Jun 25, 2020 at 12:02:45 (UTC)
Goto Top
Hi Steffen,

entschuldige bitte wenn ich Dich nochmals hierzu befragen muss. Erstmal, es stimmt - die Codierung war verkehr. Ich habe diese auf ANSI geändert, in meiner Testumgebung funktioniert es tadellos.

Wenn ich das Skript auf dem Server durchlaufen lassen möchte, dann geht es nicht.
In der Testumgebung zeigt Robocopy im Dos-Fenster, detailliert was er getan hat.
Auf dem Server öffnet sich zwar das DOS Fenster, aber dann kommt relativ schnell der Hinweis: "Drücken Sie eine beliebige Taste". Demnach wird das Skript nicht korrekt ausgeführt.
rootfolder ist richtig angegeben, und ich führe den Vorgang mit Admin-Rechten aus.
Die Berechtigungen habe ich nochmal geprüft, hier dürfte kein Problem liegen.

Hast Du hier noch eine Idee?
Dankeschön im Voraus
Mats
Member: rubberman
rubberman Jun 25, 2020 at 15:31:21 (UTC)
Goto Top
Hallo Mats,

hmm möglicherweise. Hast du das Sever Share auf ein Netzlaufwerk gemappt oder nutzt du den rohen UNC Pfad?
Ungetestetes Workaround:
@echo off &setlocal
set "rootfolder=Z:\Projekte"  
pushd "%rootfolder%"  
for /d %%i in ("*") do (  
  if exist "%%~i\Gewerbe\BHV" if exist "%%~i\Gewerbe\BHV (1)" (  
    robocopy "%%~i\Gewerbe\BHV (1)" "%%~i\Gewerbe\BHV" /e /r:0 /w:0  
  )
)
popd
pause
Verstehst du den Code um selbst auf Ursachenforschung gehen zu können, oder ist dir nicht klar wie er funktioniert?

Steffen
Member: Tankwart04
Tankwart04 Jun 25, 2020 at 20:07:09 (UTC)
Goto Top
Hi Steffen,

vielen Dank für Deine Hilfe. Der Fehler trat auf, da einige Unterordner von Mitarbeitern mit einem A-Umlaut umbenannt wurden.
Das ist mir leider erst jetzt aufgefallen, die Ausführung bleibt am "ä" hängen.

Ich habe die Zeichentabelle mit "chcp 1252" temporär geändert. Der Batch-Code lief dann fehlerfrei durch.
Habe nun auch verstanden, dass ich an der Ordnerstruktur und den Benutzerrechten etwas machen muss. User sollten die Baumstruktur nicht verändern dürfen.

Danke nochmals recht herzlich
Mars