goliax
Goto Top

Vorhandene Datei automatisch in neu erstellte Ordner kopieren

Hallo zusammen.
Ich möchte folgendes realisieren, habe da aber keinen Ansatz gefunden.

Ich habe eine Exceldatei mit Inhalt.
Ich habe eine Ordnerstruktur auf einem Netzlaufwerk.

  • Ordner 1
        • Ordner 1.1
              • Ordner 1.1.1
              • Ordner 1.1.2
        • Ordner 1.2
              • Ordner 1.2.1
              • Ordner 1.2.2

    usw.

    über das Jahr kommen in Ordner 1
    neue Unterordner, und auch Unterunterordner hinzu.

    Ich möchte, das die Exceldatei automatisch nach dem Erstellen eines Unterordners und Unterunterordners in eben diesen kopiert wird, habe aber keine Ahnung, wie ich das anstellen soll.
    Im Moment kopiere ich die Datei von Hand, was aber echt Lästig ist, da am Tag auch schon mal 10 neue Unterordner hinzukommen.

    Könnt ihr mir da weiterhelfen?

Content-Key: 627153

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

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

Member: NordicMike
NordicMike Dec 01, 2020 at 15:13:19 (UTC)
Goto Top
d.H. sobald jemand einen Ordner und Unterordner erstellt, soll die Excel Datei automatisch dort hin verschoben werden?
Member: Pjordorf
Pjordorf Dec 01, 2020 at 15:24:37 (UTC)
Goto Top
Hallo,

Zitat von @NordicMike:
d.H. sobald jemand einen Ordner und Unterordner erstellt, soll die Excel Datei automatisch dort hin verschoben werden?
Der TO sagt explicit kopieren, nicht verschieben face-smile

Gruß,
Peter
Member: Goliax
Goliax Dec 01, 2020 at 16:10:17 (UTC)
Goto Top
Unterordner und/oder Unterunterordner erstellt-> automatisch Datei in neuen Ordner kopiert, nicht verschieben
Mitglied: 146707
Solution 146707 Dec 01, 2020, updated at Dec 10, 2020 at 12:52:21 (UTC)
Goto Top
Kleines PS Skript mit Filesystemwatcher...
$folder = 'D:\Basefolder'  
$global:file = 'D:\datei.xlsx'  

Unregister-Event -SourceIdentifier ObjCreated -EA 0
$fsw = New-Object IO.FileSystemWatcher $folder, '*' -Property @{IncludeSubdirectories = $true;NotifyFilter = [IO.NotifyFilters]'DirectoryName','LastWrite'}   

Register-ObjectEvent $fsw Created -SourceIdentifier ObjCreated -Action { 
    $fullpath = $Event.SourceEventArgs.FullPath
    $timeStamp = $Event.TimeGenerated
    if((gi $fullpath).PSIsContainer){
        Write-Host "Der Ordner '$fullpath' wurde um '$timeStamp' erstellt." -f green  
        if (!(Test-Path (join-path $fullpath ([io.path]::GetFileName($global:file))))){
            copy -LiteralPath $global:file -Destination $fullpath -Verbose -Force
        }
    }
} | out-null

cls
Write-Host "Warte auf neue Ordner unterhalb (rekursiv) von '$folder' ..." -f Green  

while($true){
    [void]$fsw.WaitForChanged("Created",2000)  
}
Member: Goliax
Goliax Dec 10, 2020 updated at 12:38:39 (UTC)
Goto Top
Hallo primal,
vielen Dank erst einmal für das Skript!

Power Shell schmeisst allerdings folgenden Fehler:

Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat.
In D:\Power_Shell_ISE_BV_Begleitzettel\skript2020.ps1:22 Zeichen:5
+     [void]$fsw.WaitForChanged("Created",2000)  
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) , RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull
Mitglied: 146707
146707 Dec 10, 2020 updated at 12:50:40 (UTC)
Goto Top
Dann hast du's nicht richtig angepasst einen ungültigen Pfad angegeben (Ein FSW kann zu.B. keine UNC Pfade nutzen) oder eine zu alte PS.

Wurde hier getestet und läuft einwandfrei.
Member: Goliax
Goliax Dec 10, 2020 at 13:48:02 (UTC)
Goto Top
so hab ich den Code angepasst:
$folder = 'S:\2020'  
$file = 'S:\BV-Begleitzettel.xlsx'  

Unregister-Event -SourceIdentifier ObjCreated -EA 0
$fsw = New-Object IO.FileSystemWatcher $folder, '*' -Property @{IncludeSubdirectories = $true;NotifyFilter = [IO.NotifyFilters]'DirectoryName','LastWrite'}   

Register-ObjectEvent $fsw Created -SourceIdentifier ObjCreated -Action { 
    $fullpath = $Event.SourceEventArgs.FullPath
    $timeStamp = $Event.TimeGenerated
    if((gi $fullpath).PSIsContainer){
        Write-Host "Der Ordner '$fullpath' wurde um '$timeStamp' erstellt." -f green  
        if (!(Test-Path (join-path $fullpath ([io.path]::GetFileName($file))))){
            copy -LiteralPath $file -Destination $fullpath -Verbose -Force
        }
    }
} | out-null

cls
Write-Host "Warte auf neue Ordner unterhalb (rekursiv) von '$folder' ..." -f Green  

while($true){
    [void]$fsw.WaitForChanged("Created",2000)  
}

das ist die PS Version, die ich installiert habe:
Name                           Value
----                           -----
PSVersion                      5.1.18362.1171
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.18362.1171
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
Member: Goliax
Goliax Dec 10, 2020 at 13:53:07 (UTC)
Goto Top
Muss das Skript in dem Ordner liegen, und von dort aus ausgeführt werden?
Member: Goliax
Goliax Dec 10, 2020 updated at 14:06:46 (UTC)
Goto Top
KOMMANDO ZURÜCK!!!!!
Danke, läuft! ich hatte doch glatt einen Unterordner vergessen...
nicht S:\2020
sondern S:\S&SBV\2020..

sorryy
Mitglied: 146707
146707 Dec 10, 2020 at 14:05:57 (UTC)
Goto Top
Sach ich doch face-wink.
Member: Goliax
Goliax Dec 10, 2020 updated at 16:31:35 (UTC)
Goto Top
jetzt fehlt mir nur noch der Trick, wie das Script beim Systemstart automatisch im Hintergrund ausgeführt wird.
mit dem Aufgabenplaner funkt das irgendwie nicht, und das Skript die ganze Zeit laufen zu haben am Desktop ist auch recht ätzend.
am Liebsten hätte ich das Script als Dienst laufen
Mitglied: 146707
146707 Dec 10, 2020 updated at 16:38:47 (UTC)
Goto Top
Zitat von @Goliax:
mit dem Aufgabenplaner funkt das irgendwie nicht,
Sicher geht das, mach es halt richtig ... Nur zur Info, Netzlaufwerke sind Userabhängig gemappt, also muss entweder das Skript mit den Creds des users laufen oder im Skript das Laufwerk erst gemappt werden, oder ein UNC-Pfad genutzt werden, das ist sicher dein Fehler! Beachtet man das kann man das auch mittels System-Account laufen lassen (Berechtigungen/NTFS-ACLs der Zielordner beachten!).
Member: Goliax
Goliax Dec 10, 2020 at 16:48:52 (UTC)
Goto Top
ich mach jetzt Feierabend, schaue mir das morgen nochmal in Ruhe an.
Ich habe festgestellt, das das Script nur mit der Powershell_ise.exe richtig läuft.
wenn ich das Script über rechtsklick > mit Powershell ausführen - starte, kommt zwar die Meldung, das ein neuer Ordner angelegt wurde, aber der Kopiervorgang findet nicht statt.
mit Powershell.exe
Warte auf neue Ordner unterhalb (rekursiv) von 'S:\S&SBV\2020' ...  
Der Ordner 'S:\S&SBV\2020\Neuer Ordner' wurde um '12/10/2020 17:41:05' erstellt.  
Der Ordner 'S:\S&SBV\2020\Neuer Ordner' wurde um '12/10/2020 17:41:05' erstellt.  
Der Ordner 'S:\S&SBV\2020\Neuer Ordner' wurde um '12/10/2020 17:41:18' erstellt.  
Der Ordner 'S:\S&SBV\2020\Neuer Ordner' wurde um '12/10/2020 17:41:18' erstellt.  
und der Ordner bleibt leer

mit Powershell_ise.exe
Warte auf neue Ordner unterhalb (rekursiv) von 'S:\S&SBV\2020' ...  
Der Ordner 'S:\S&SBV\2020\Neuer Ordner' wurde um '12/10/2020 17:45:53' erstellt.  
AUSFÜHRLICH: Ausführen des Vorgangs "Datei kopieren" für das Ziel "Element: S:\BV-Begleitzettel.xlsx Ziel: S:\S&SBV\2020\Neuer Ordner\BV-Begleitzettel.xlsx".  
Der Ordner 'S:\S&SBV\2020\Neuer Ordner' wurde um '12/10/2020 17:45:53' erstellt.  
Der Ordner 'S:\S&SBV\2020\Neuer Ordner' wurde um '12/10/2020 17:46:27' erstellt.  
AUSFÜHRLICH: Ausführen des Vorgangs "Datei kopieren" für das Ziel "Element: S:\BV-Begleitzettel.xlsx Ziel: S:\S&SBV\2020\Neuer Ordner\BV-Begleitzettel.xlsx".  
Der Ordner 'S:\S&SBV\2020\Neuer Ordner' wurde um '12/10/2020 17:46:27' erstellt.  
und die Datei wird kopiert
Mitglied: 146707
146707 Dec 10, 2020 updated at 16:58:02 (UTC)
Goto Top
Nö, klappt hier einwandfrei. Kopiere das Skript nochmal in deinem erneut geposteten sind noch ein paar Variablen aus einer alten Version gesetzt. Wohl irgendwas im Browser-Cache hängen geblieben.