Löschen eines Verzeichnisses auf mehreren Rechnern
Hallo zusammen,
ich wollte bei folgendem Script mit Variablen arbeiten, bekomme aber irgendwie die Kurve nicht ganz, muß auch gestehen das ich mit dem PS-Thema nicht so tief drin bin, aber man braucht es halt.
$path1 = "C:\temp\Test_Folder"
funktioniert wenn Pfad ausgeschrieben wird:
funktioniert nicht:
es kommt folgender Fehler:
Cannot bind argument to parameter 'Path' because it is null.
+ CategoryInfo : InvalidData: ( [Remove-Item], ParameterBindingValidationExceptio
n
+ FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.RemoveItemCommand
+ PSComputerName : Testserver
Ich vermute das der Befehl Remove-Item hier einfach nicht korrekt ist und ein anderer Befehl mit der Variablen genutzt werden muß?
Wenn ich mit Remove-Variable arbeite, dann geht es auch nicht. Habe mir da den MS-Artikel "https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/remove-variable?view=powershell-7.2" angeschaut.
foreach ($server in (Get-Content $serverlist)){Invoke-Command -ComputerName $server {Remove-Variable -name path1 }}
Cannot find a variable with the name 'path1'.
+ CategoryInfo : ObjectNotFound: (path1:String) [Remove-Variable], ItemNotFoundException
+ FullyQualifiedErrorId : VariableNotFound,Microsoft.PowerShell.Commands.RemoveVariableCommand
+ PSComputerName : dfviasifts1901
Die Variable hatte ich vorher gesetzt und die wird auch sauber aufgelöst.
Wo mache ich den Fehler?
Danke und Grüße
Gmeurb
ich wollte bei folgendem Script mit Variablen arbeiten, bekomme aber irgendwie die Kurve nicht ganz, muß auch gestehen das ich mit dem PS-Thema nicht so tief drin bin, aber man braucht es halt.
- Set variables
$path1 = "C:\temp\Test_Folder"
funktioniert wenn Pfad ausgeschrieben wird:
- Execute
funktioniert nicht:
- Execute
es kommt folgender Fehler:
Cannot bind argument to parameter 'Path' because it is null.
+ CategoryInfo : InvalidData: ( [Remove-Item], ParameterBindingValidationExceptio
n
+ FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.RemoveItemCommand
+ PSComputerName : Testserver
Ich vermute das der Befehl Remove-Item hier einfach nicht korrekt ist und ein anderer Befehl mit der Variablen genutzt werden muß?
Wenn ich mit Remove-Variable arbeite, dann geht es auch nicht. Habe mir da den MS-Artikel "https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/remove-variable?view=powershell-7.2" angeschaut.
foreach ($server in (Get-Content $serverlist)){Invoke-Command -ComputerName $server {Remove-Variable -name path1 }}
Cannot find a variable with the name 'path1'.
+ CategoryInfo : ObjectNotFound: (path1:String) [Remove-Variable], ItemNotFoundException
+ FullyQualifiedErrorId : VariableNotFound,Microsoft.PowerShell.Commands.RemoveVariableCommand
+ PSComputerName : dfviasifts1901
Die Variable hatte ich vorher gesetzt und die wird auch sauber aufgelöst.
Wo mache ich den Fehler?
Danke und Grüße
Gmeurb
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 2278420253
Url: https://administrator.de/contentid/2278420253
Ausgedruckt am: 22.11.2024 um 08:11 Uhr
10 Kommentare
Neuester Kommentar
Moin,
das schreibt dir das Skript doch:
Problem:
Du definierst den Pfad zwar, gibst ihn aber nicht beim invoke-Command als Parameter mit. Daher kennt der Befehl die Pfadvariable nicht.
Gruß
Doskias
Nachtrag:
So sollte es klappen:
Ausführliche Erklärung:
Durch -Argumentlist $path1 wird die Variable $Path1 als erste Variable in das Invoke-Command übergeben. Durch Param($neuer_pfad) wird der Reihenfolge nach gefüllt. Also der erste Parameter wird mit dem ersten param verknüpft. Dadurch wird der Inhalt von $path1 nach $neuer_Pfad übergeben und steht dann im Skript zur Verfügung. Du kannst die beiden Parameter auch gleich benennen, aber so wird es für die Erklärung übersichtlicher
das schreibt dir das Skript doch:
Cannot bind argument to parameter 'Path' because it is null.
Problem:
Du definierst den Pfad zwar, gibst ihn aber nicht beim invoke-Command als Parameter mit. Daher kennt der Befehl die Pfadvariable nicht.
Gruß
Doskias
Nachtrag:
So sollte es klappen:
foreach ($server in (Get-Content $serverlist))
{
Invoke-Command -ComputerName $server {
param($neuer_pfad)
Remove-Item -path $neuer_pfad -Recurse -Force }
-ArgumentList $path1
}
Ausführliche Erklärung:
Durch -Argumentlist $path1 wird die Variable $Path1 als erste Variable in das Invoke-Command übergeben. Durch Param($neuer_pfad) wird der Reihenfolge nach gefüllt. Also der erste Parameter wird mit dem ersten param verknüpft. Dadurch wird der Inhalt von $path1 nach $neuer_Pfad übergeben und steht dann im Skript zur Verfügung. Du kannst die beiden Parameter auch gleich benennen, aber so wird es für die Erklärung übersichtlicher
Alternativ zur Argumentlist gehts auch direkt mit $using:path1
about_Remote_Variables
about_Remote_Variables
Zitat von @1915348599:
Alternativ zur Argumentlist gehts auch direkt mit $using:path1
about_Remote_Variables
Alternativ zur Argumentlist gehts auch direkt mit $using:path1
about_Remote_Variables
Den kannte ich noch nicht.
Dann müsste es ja auch so gehen:
foreach ($server in (Get-Content $serverlist)){Invoke-Command -ComputerName $server {Remove-Item -path $using:path1 -Recurse -Force }}
Zitat von @gmeurb:
Ja, super danke Doskias,
dass hat funktioniert, nachdem ich die letzten beiden Zeilen so sortiert hatte:
Remove-Item -path $neuer_pfad -Recurse -Force } -ArgumentList $path1
}
Stimmt. Hab ich im Forum oben falsch sortiert ;)Ja, super danke Doskias,
dass hat funktioniert, nachdem ich die letzten beiden Zeilen so sortiert hatte:
Remove-Item -path $neuer_pfad -Recurse -Force } -ArgumentList $path1
}
Nun zu meinem Verständnis, ich will ja nicht nur jemanden meine Arbeit machen lassen, sondern es auch verstehen!
Guter Ansatz Ich setze vor dem Remove-Item Befehl quasi einen Parameter mit einer neuen Variablen, welche nur in der Klammer greift, diese holt sich über die ArgumentList hinter dem eigentlichen Löschbefehl meine feste Variable "$path1" ?
Nun, wenn ich zwei Verzeichnisse löschen möchte kopiere ich einfach das Ganze, setze dann die neuen Variablen (z.B. $path2, $neuer_pfad2) und fertig, jedenfalls hat es so funktioniert.
Ich würde das dann so aufbauen, nur das Invoke-command:Nun, wenn ich zwei Verzeichnisse löschen möchte kopiere ich einfach das Ganze, setze dann die neuen Variablen (z.B. $path2, $neuer_pfad2) und fertig, jedenfalls hat es so funktioniert.
Invoke-Command -ComputerName $server {
param (
$neuer_pfad,
$zweite_variable
)
Remove-Item -path $neuer_pfad -Recurse -Force
Remove-Item -path $zweite_variable-Recurse -Force } -ArgumentList $path1 $path2
Die Parameter unter param werden einfach der Reihenfolge nach gefüllt. Spricht, das erste Argument in der Liste wird $neuer_Pfad, das zweite Argument in der Liste wird dann $zweite_variable. Du kannst so alles mitgeben was du möchtest, also auch Zahlen oder Strings.
Wenn du zwei Parameter definierst, aber nur einen übergibst, bleibt der zweite einfach leer.
Gruß
Doskias
Ich würde das ganze ja gleich mit ner simplen GPO/GPP abfackeln, script überflüssig ...
Zitat von @1915348599:
Ich würde das ganze ja gleich mit ner simplen GPO/GPP abfackeln, script überflüssig ...
Ich würde das ganze ja gleich mit ner simplen GPO/GPP abfackeln, script überflüssig ...
In dem Fall zum Löschen des Folders geht das sicherlich. Aber das ist ja "nur" der Einstieg in die Thematik. Das Hauptproblem ist ja nicht das Löschen des Ordners, das ist nur das Symptom. Kern der Frage und Auslöser für das Topic ist ja eher die Frage, wie man Variablen in das Invoke-Command übermittelt.
Naja hätte ja auch sein können das er die Möglichkeit vor lauter Brett vorm Kopp einfach nicht mehr gesehen hat .