Powershell: copy-item beschleunigen
Moin Moin Zusammen,
ich habe 2 Fragen zu meinem folgenden Skript.
Ich muss auf ca. 200 Clients einen Ordner kopieren (ca 100mb groß) und auf diesen Ordner der lokalen Gruppe Users Vollzugriff geben.
GPOs kommen leider nicht in Frage. Muss händisch passieren.
Folgendes ist vorhanden
1. Gibt es eine Möglichkeit das kopieren zu beschleunigen, evtl. den Ordner auf mehrere PCs gleichzeitig zu kopieren?
2. Die Log Datei nach erfolgreichen/nicht erfolgreichen Kopieren/Berechtigungen zu sortieren. Aktuell haut er mir beides in jeweils eine Datei. Ich weiß daher nicht was bspw. falsch lief...Kopiervorgang oder Berechtigung setzen.
ich habe 2 Fragen zu meinem folgenden Skript.
Ich muss auf ca. 200 Clients einen Ordner kopieren (ca 100mb groß) und auf diesen Ordner der lokalen Gruppe Users Vollzugriff geben.
GPOs kommen leider nicht in Frage. Muss händisch passieren.
Folgendes ist vorhanden
param([switch]$Elevated)
function Test-Admin {
$currentUser = New-Object Security.Principal.WindowsPrincipal $([Security.Principal.WindowsIdentity]::GetCurrent())
$currentUser.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
}
if ((Test-Admin) -eq $false) {
if ($elevated) {
# tried to elevate, did not work, aborting
} else {
Start-Process powershell.exe -Verb RunAs -ArgumentList ('-noprofile -noexit -file "{0}" -elevated' -f ($myinvocation.MyCommand.Definition))
}
exit
}
'running with full privileges'
write-host
write-host
$file = get-content -path "C:\temp\pc.txt"
foreach($pc in $file) {
try {
copy-item -path "\\server1\folder1" -Destination "\\$pc\C$\temp\" -recurse
foreach($pc in $file) {
$acl = get-acl -path "\\$pc\c$\temp\folder1"
$new = "users","full","ContainerInherit,ObjectInherit","None","Allow"
$accessRule = new-object System.Security.AccessControl.FileSystemAccessRule $new
$acl.SetAccessRule($accessRule)
$acl | Set-Acl "\\$pc\c$\temp\folder1"
}
Write-Output $([string](get-date) + "`t $pc failed") | out-file -append -filepath "C:\temp\failed.log"
}
catch {Write-Output $([string](get-date) + "`t $pc success") | out-file -append -filepath "C:\temp\success.log"
}
write-host
write-host "see Log" -foreground "green"
write-host
}
1. Gibt es eine Möglichkeit das kopieren zu beschleunigen, evtl. den Ordner auf mehrere PCs gleichzeitig zu kopieren?
2. Die Log Datei nach erfolgreichen/nicht erfolgreichen Kopieren/Berechtigungen zu sortieren. Aktuell haut er mir beides in jeweils eine Datei. Ich weiß daher nicht was bspw. falsch lief...Kopiervorgang oder Berechtigung setzen.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 647663
Url: https://administrator.de/contentid/647663
Ausgedruckt am: 21.11.2024 um 18:11 Uhr
10 Kommentare
Neuester Kommentar
Moin,
Gruß Thomas
Zitat von @chkdsk:
1. Gibt es eine Möglichkeit das kopieren zu beschleunigen, evtl. den Ordner auf mehrere PCs gleichzeitig zu kopieren?
Sicher geht das, Multithreading mittels Runspacepool.1. Gibt es eine Möglichkeit das kopieren zu beschleunigen, evtl. den Ordner auf mehrere PCs gleichzeitig zu kopieren?
2. Die Log Datei nach erfolgreichen/nicht erfolgreichen Kopieren/Berechtigungen zu sortieren. Aktuell haut er mir beides in jeweils eine Datei. Ich weiß daher nicht was bspw. falsch lief...Kopiervorgang oder Berechtigung setzen.
Wie @SlainteMhath bereits erwähnt hat, über Try-Catch, siehe hier.Gruß Thomas
Kam hier vor kurzem schon mal
Powershell Copy-Item Script schneller machen
Powershell Copy-Item Script schneller machen
Die wohl einfachste Methode wäre Powershell 7.x zu nutzen, dort hat foreach-object einen -parallel schalter:
https://devblogs.microsoft.com/powershell/powershell-foreach-object-para ...
Oder wie im verlinkten Thread von Uwe selbstgemacht über Runspaces / Threads
Über klassiche Jobs sollte es aber auch gehen, da es "wenig" dafür aber "große" aufgaben sind (relativ gesehen)
https://devblogs.microsoft.com/scripting/parallel-processing-with-jobs-i ...
Edit:
Für fortschrittsbalken gibts das builtin cmdlet Write-Progress
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell. ...
https://devblogs.microsoft.com/powershell/powershell-foreach-object-para ...
Oder wie im verlinkten Thread von Uwe selbstgemacht über Runspaces / Threads
Über klassiche Jobs sollte es aber auch gehen, da es "wenig" dafür aber "große" aufgaben sind (relativ gesehen)
https://devblogs.microsoft.com/scripting/parallel-processing-with-jobs-i ...
Edit:
Für fortschrittsbalken gibts das builtin cmdlet Write-Progress
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell. ...
Sollte der PC aus sein, wird er ja übersprungen
Denke daran, der Copy Job hängt dann erst einmal, bis es einen Timeout erzeugt. Auch musst du dann später überlegen, wer es schon kopiert bekommen hat oder wer es noch nicht hat und notfalls es allen noch einmal pushen, bis es auch der letzte endlich erhalten hat - oder die letzten einzeln raus suchen und es ihnen noch einmal antriggern.Zitat von @chkdsk:
@147323
das hatte ich tatsächlich schon gesehen, aber wie bspw. in der Lösung angesprochen, pipe ich nicht auf das object
Na und wo ist das Problem?? Musst du ja nicht ... Verstand benuten .@147323
das hatte ich tatsächlich schon gesehen, aber wie bspw. in der Lösung angesprochen, pipe ich nicht auf das object