Jump to content

alle ZIP von ordner mit copy-item als job


Go to solution Solved by testperson,

Recommended Posts

Hallo zusammen,

 

ich hoffe hier endlich das richtige Forum gefunden zu haben.

Erst seit letztem Jahr hab ich Powershell für mich entdeckt und bisher im selbststudium gelernt. Von daher verzeiht mir Anfängerfehler...

 

Ich möchte alle ZIP dateien aus einem ordner als "Start-Job" (oder ähnliches) starten.

Ideal wäre es wenn man das ganze noch als "Invoke-Command –ComputerName $name -Credential $cred -Authentication Negotiate –ScriptBlock {}" machen könnte

 

Hintergrund:

Ich benötige zum verarbeiten jeden Tag die ZIP dateien von 43 Windows Geräten.

Bisher wurde das von meinem Vorgänger immer über den Windows-Explorer via SMB Freigabe einzeln gemacht (copy&paste)... Fragt hier lieber nicht "Warum?! :lool:

 

Es sind teilweise mehrere ZIP und die würde ich nur ungern einzeln verarbeiten...

Mein bisher "bester Versuch:

 

$quelle1 = '\\test\test.zip'
$quelle2 = '\\test\test2.zip'

$ziel = "C:\XY\$computername\$(get-date -format "dd-MM-yyyy")\"
$ordner = "C:\YX\$computername"

if(!($ordner)){
    mkdir -Path $ordner -Force
    }

Start-Job -Scriptblock{
    param($quelle1,$ziel)
    copy-item -Path $quelle1 -Destination $ziel -Force -Verbose -PassThru
} -ArgumentList $quelle1,$ziel

Start-Job -Scriptblock{
    param($quelle2,$ziel)
    copy-item -Path $quelle2 -Destination $ziel -Force -Verbose -PassThru
} -ArgumentList $quelle2,$ziel

get-job | wait-job | Remove-Job

 

Ich bin über jede Hilfe dankbar!

 

gruß cosmo87

Link to post

ja genau,sry '^^

 

Ich hatte es mit dem skript von dem lokalem Gerät getestet. quelle müsste eigentlich "c:\test\test" heißen.

Ich würde nur gern die "Logik" hinter dem start-job verstehen.. Vor allem die Übergabe der "param" klappt mir, je nach dem was ich wieder getestet habe... , nicht. Auch eine "ArgumentList" habe ich mittel "Invoke-Command" versucht. Auch hier fand keine Übergabe der Variablen statt.

Link to post

Hallo,

 

die Herangehensweise kann man auch umdrehen. Du könntest ein kleines Skript schreiben welches die Datei(en) auf eine Freigabe kopiert. Das Skript lässt du über die Aufgabenplanung auf den jeweiligen PCs regelmäßig ausführen. Damit würdest du auch das Problem der "delegated Credentials" umgehen, falls du den Kopiervorgang auf eine Freigabe starten möchtest.

 

Schöne Grüße

  • Like 1
Link to post
vor 10 Stunden schrieb Dukel:

Wieso möchest du das als Job machen? Wegen paralellisierung?

 

Wenn du das verstehen möchtest kannst du die Hilfe & Beispiele anschauen:

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/start-job?view=powershell-7.1#examples

 

z.B.:

Start-Job -ScriptBlock { Get-Process -Name $args } -ArgumentList powershell, pwsh, notepad

 

Ja genau. Stichwort parallelisierung.

 

Ich weiß es gibt gefühlt 1000 Wege das zu realisieren, aber eben an dem Punkt "paralelle ausführung" z.B. von einem Array, bin ich an die Grenze von meinem Selbst-Studium geraten.

Ich habe mehrere Std (mittlerweile über 40Std.) versucht dass es funktioniert. Wahrscheinlich bin ich gedanklich in einer Sackgasse...

 

Zusätzlich zu "Start-Jobs" bzw "AsJob" habe ich dann noch

"./start.ps1" ein skript starten (wobei ich mich hier frage wie man die variablen übergibt und ggf. wieder variablen in das aktuelle powershell übergibt)

"Jobs mit Runspace / Invoke", "MultiThreading mit PowerShell mit .NET", "XCOPY" , "ROBOCOPY", "Workflow", "ForEach-Object -parallel",

und letztendlich noch über WMI-Objekte. Danach war die Verwirrung komplett :/

 

Anfangs dachte ich: "wenn es im internet explorer so einfach geht, dann doch auch mit Powershell" :lool:

 

vor 9 Stunden schrieb MurdocX:

Hallo,

 

die Herangehensweise kann man auch umdrehen. Du könntest ein kleines Skript schreiben welches die Datei(en) auf eine Freigabe kopiert. Das Skript lässt du über die Aufgabenplanung auf den jeweiligen PCs regelmäßig ausführen. Damit würdest du auch das Problem der "delegated Credentials" umgehen, falls du den Kopiervorgang auf eine Freigabe starten möchtest.

 

Schöne Grüße

 

Das war auch schon meine Überlegung. Nur möchte ich das selbst manuell anstossen und ich wollte keine 43 skripte einzeln dafür schreiben. Eher würde ich es hier über ein Invoke-Command oder dem PSRemote machen, bzw "Invoke-Command -FromSession" hab auch das schon versucht. Jedoch ohne Erfolg da ich die Variablen nicht übergeben konnte (-ArgumentList).

Edited by cosmo87
EDIT: verschluckte Eingaben und Rechtschreibfehler ausgebessert.
Link to post
vor 13 Minuten schrieb Dukel:

Wie ist denn jetzt der aktuelle Stand? Was hast du? Funktioniert oder nicht? Gibt es Fehlermeldungen?

 

Das Skript aus dem ersten Post brachte bisher etwas. aber nur wenn ich für jede Datei einen eigenen "Start-Job -Scriptblock{}" geschrieben habe.

 

Fehlermeldung kommt keine. Wie ich den Job anders als wie mit Get-Job sinn auslesen kann, weiß ich auch nicht sicher :lool:

 

Edited by cosmo87
Link to post
vor einer Stunde schrieb cosmo87:

ich wollte keine 43 skripte einzeln dafür schreiben.

Ich kann mir gut vorstellen, dass wir hier ansetzen können und aus 43 -> eins machen.

 

Wenn ich es aus dem Kontext richtig verstehe, dann geht es nicht darum den effizientesten Weg zu finden, sondern die Aufgabe mit "Start-Job" zu lösen?

Link to post
vor 24 Minuten schrieb tesso:

Ich frage mich schon die ganze Zeit wie groß die Archive sind. Warum packt man die nicht nacheinander aus?

Ich vermute, weil er 43 Stück auf 43 Computern hat. Das wäre bei 40Std. investiertem Aufwand sicher auch drin gewesen. :-)

 

Gerade den Zugriff auf die administrativen Freigaben finde ich sehr bedenklich. Das sollte anders zu lösen sein. In diesem Befehl sind mehrere Hinweise für deine Umsetzung:

Start-Job -Name $Computername -ArgumentList @($Computername, $Filename, $DestinationPath) -ScriptBlock { $args[0],$args[1],$args[2] }

 

Edited by MurdocX
  • Like 1
Link to post

Ich steuere auch noch etwas Senf bei :-)

 

Stand oben schon mal - "Push" auf eine Freigabe wäre besser als Pull. Push ist fast immer besser als Pull. Was spricht dagegen?

Wie man den Push dann genau gestaltet - da gibt es viele Möglichkeiten. Hängt stark davon ab, wie dieses Zip entsteht. Mir persönlich würde da ein scheduled Task "at Startup" einfallen, der nen FS-Watcher initialisiert und das Zip dann sobald es auftaucht auf nen Share kopiert.

 

Was in der Frage des TO völlig fehlt: Was ist das "eigentliche" Ziel?  Einsammeln von ZIPs sicher nicht :-)

Um hier eine für mich sinnvolle Lösung vorzuschlagen, fehlt mir zu viel Wissen über das Environment.

  • Like 1
Link to post

Nach mehrmaligen Login und 3 x passwort reset, nun endlich wieder hier... am Handy ist der Login sogar gar nicht möglich?!

 

BTT:

Ihr seid der Wahnsinn!! Bevor ich dieses Forum gefunden habe war ich in 2 anderen. Da wurde man schon für Rechtschreibfehler angeschi**en.. vom 2. rede ich erst gar nicht :rolleyes:

 

vor 7 Stunden schrieb MurdocX:

Wenn ich es aus dem Kontext richtig verstehe, dann geht es nicht darum den effizientesten Weg zu finden, sondern die Aufgabe mit "Start-Job" zu lösen?

Was wäre der effizienteste Weg? :lool: ich bin mir nach der ganzen Recherche da nicht mehr so sicher... Es muss nicht Start-Job sein, bzw. würde ich es zumindest gerne verstehen.

 

vor 7 Stunden schrieb tesso:

Ich frage mich schon die ganze Zeit wie groß die Archive sind. Warum packt man die nicht nacheinander aus?

Die Dateien sind zwischen 20-300mb groß. Zum "Warum?!" komme ich gleich weiter unten.

 

vor 7 Stunden schrieb MurdocX:

Ich vermute, weil er 43 Stück auf 43 Computern hat. Das wäre bei 40Std. investiertem Aufwand sicher auch drin gewesen.

Ja, hätte ich in dieser Zeit durchaus mit anderer Software lösen können, bzw. habe ich es teilweise schon, aber so habe ich wieder einiges für Powershell gelernt :shy: was mir auch in den nächsten Projekten nützlich sein wird. Mir steht da noch so einiges bevor... Auch hier komme ich gleich weiter unten dazu :lool:

vor 7 Stunden schrieb MurdocX:

Gerade den Zugriff auf die administrativen Freigaben finde ich sehr bedenklich. Das sollte anders zu lösen sein. In diesem Befehl sind mehrere Hinweise für deine Umsetzung:


Start-Job -Name $Computername -ArgumentList @($Computername, $Filename, $DestinationPath) -ScriptBlock { $args[0],$args[1],$args[2] }

 

In diesem Firmen-Netzwerk ist noch so einiges aufzuholen. Da sind diese administrativen Freigaben noch das kleinere übel...

Diesen Befehl hab ich so auch noch nicht gefunden. Wobei ich das "-Name" im Bezug auf "Start-Job" nicht ganz verstehe. Ist das dann ein Remote-Befehl?

 

vor 7 Stunden schrieb tesso:

Liste der Dateien erstellen und dann foreach.

Ich sehe den Sinn im Job an der Stelle nicht. 

 

Evtl. noch mit einer Liste der Computer und invoke-command

Weil: Wenn ich es nacheinander ablaufen lasse, das ganze schon mal über 4 Std. dauern kann. Das liegt teilweise an der Anbindung oder auch an Verbindungsabbrüchen. Invoke-Command habe ich schon getestet, leider ohne Erfolg (siehe mein Post weiter oben :lool:

 

vor 6 Stunden schrieb daabm:

Ich steuere auch noch etwas Senf bei :-)

 

Stand oben schon mal - "Push" auf eine Freigabe wäre besser als Pull. Push ist fast immer besser als Pull. Was spricht dagegen?

Wie man den Push dann genau gestaltet - da gibt es viele Möglichkeiten. Hängt stark davon ab, wie dieses Zip entsteht. Mir persönlich würde da ein scheduled Task "at Startup" einfallen, der nen FS-Watcher initialisiert und das Zip dann sobald es auftaucht auf nen Share kopiert.

 

Was in der Frage des TO völlig fehlt: Was ist das "eigentliche" Ziel?  Einsammeln von ZIPs sicher nicht :-)

Um hier eine für mich sinnvolle Lösung vorzuschlagen, fehlt mir zu viel Wissen über das Environment.

Danke für diese Idee und der Erklärung! Ich merke schon dass ihr einem wirklich RICHTIG helfen wollt, eben das "Problem" an der Wurzel anpacken. :grins2::thumb1:

 

Zum Background bzw dem "Environment":

Ich bin ein Administrator von diesem Netzwerk nach gerade mal 1 Jahr. Wenn nicht sogar der Hauptadmin...

Geschuldet durch Geiz, Mangel an Fachinformatiker und fehlendem Personal ist hier einiges aufzuholen um das Unternehmen aus der IT-Steinzeit raus zu holen. Es gibt auch erst seit etwas über 1 Jahr erst eine VPN Verbindung zu diesen 43 Systemen, genauer gesagt 43 Standorte. Davor wurden die Daten völlig unverschlüsselt (zB HTTP) übertragen. Das Problem ist hier die verwendete Software die eigentlich dieses Jahr abgelöst werden sollte. Jetzt läuft sie aber noch für 3 weitere Jahre. Aber diese Entscheidung liegt außerhalb meiner Befugnis..

 

Die genannten ZIP Dateien sind die Backup Daten (natürlich auch unverschlüsselt) der Datenbank der jeweiligen Systeme. Das einzige Backup davon wird auf einem lokalem USB-Stick gespeichert bzw. werden die Daten Abends an die Zentrale übertragen. Sollte wieder Hochwasser kommen.. da will ich gar nicht weiter dran denken. Bisher ist es fast immer gut gelaufen, aber auf das will ich mich nicht verlassen!

 

Angebunden sind die Systeme via VPN (site-to-site) an den Standorten sind keine besonders zuverlässigen Router und die Zentrale mit einer Sophos XG Firewall. Es wurden immerhin schon die meisten Anbindungen der Router von ADSL auf VDSL Glasfaser umgestellt. Trotzdem müssen die VPN Verbindungen teilweise neu gestartet werden (hierfür baue ich auch schon ein Skript da ich keinen Vollzugriff auf die Sophos habe und somit nur über die WebGUI die Verbindung neu starten kann)

 

Dann steht demnächst noch eine Neu-konfigurierung der Drucker (auch 43 Stück) an. Bisher wurde das über die WebGUI gemacht. Auch hier kann ich mir den Einsatz von PS vorstellen.

Achja, die Router müssten auch noch...

 

Die Angebotenen Admin-Software ist entweder nicht nutzbar oder fehlerhaft.

Drittanbieter-Software würde wieder Kosten verursachen und ich müsste mich da auch reinarbeiten...

 

Mir steht noch viel Bevor :scream:

 

Was in der Frage des TO völlig fehlt: Was ist das "eigentliche" Ziel?

Mir gehts um´s Prinzip!!! :lol2:

Bzw. ich möchte mehr über Powershell lernen und ich bin jemand der nicht nur copy&paste machen will, sondern auch verstehen können was dahinter steckt. Zumindest eine gewisse Logik.

 

Wie gesagt: Ich weiß es gibt viele Weg um das meiste davon umzusetzen, aber aus mangelden ressourcen teilweise nicht umsetzbar. Hätte ich einen guten Programmierer zur Hand oder einen "Powershell-Profi", würde mir dadurch viel Zeit erspart

Ich bin auch dabei eine PowershellGUI zu erstellen, aber dafür würde ich dann einen seperaten Thread eröffnen.

 

Sollten noch Fragen offen sein, einfach schreiben :shy:

 

EDIT: Sry für den langen Text!

Link to post

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...