gmeurb
Goto Top

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.

  1. Set variables
$serverlist = "C:\Anwendungen\serverlist.txt"
$path1 = "C:\temp\Test_Folder"

funktioniert wenn Pfad ausgeschrieben wird:
  1. Execute
foreach ($server in (Get-Content $serverlist)){Invoke-Command -ComputerName $server {Remove-Item -path "C:\temp\Test_Folder" -Recurse -Force }}

funktioniert nicht:
  1. Execute
foreach ($server in (Get-Content $serverlist)){Invoke-Command -ComputerName $server {Remove-Item -path $path1 -Recurse -Force }}

es kommt folgender Fehler:
Cannot bind argument to parameter 'Path' because it is null.
+ CategoryInfo : InvalidData: (face-smile [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

Content-Key: 2278420253

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

Printed on: April 27, 2024 at 15:04 o'clock

Member: Doskias
Solution Doskias Mar 25, 2022 updated at 09:19:25 (UTC)
Goto Top
Moin,

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 face-wink
Mitglied: 1915348599
Solution 1915348599 Mar 25, 2022 updated at 09:23:54 (UTC)
Goto Top
Alternativ zur Argumentlist gehts auch direkt mit $using:path1
about_Remote_Variables
Member: Doskias
Solution Doskias Mar 25, 2022 at 09:27:19 (UTC)
Goto Top
Zitat von @1915348599:
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 }}
Member: gmeurb
gmeurb Mar 25, 2022 at 10:01:19 (UTC)
Goto Top
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! face-wink

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.

Nochmals danke und Grüße
Gmeurb
Member: gmeurb
gmeurb Mar 25, 2022 at 10:11:38 (UTC)
Goto Top
Zitat von @Doskias:

Zitat von @1915348599:
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 }}

Yep, geht auch! Danke auch Dir!
Member: Doskias
Doskias Mar 25, 2022 at 10:38:22 (UTC)
Goto Top
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 ;)
Nun zu meinem Verständnis, ich will ja nicht nur jemanden meine Arbeit machen lassen, sondern es auch verstehen! face-wink
Guter Ansatz face-wink

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:
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
Mitglied: 1915348599
1915348599 Mar 25, 2022 updated at 10:47:50 (UTC)
Goto Top
Ich würde das ganze ja gleich mit ner simplen GPO/GPP abfackeln, script überflüssig ...
Member: Doskias
Doskias Mar 25, 2022 at 10:58:15 (UTC)
Goto Top
Zitat von @1915348599:
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. face-wink
Mitglied: 1915348599
1915348599 Mar 25, 2022 updated at 11:08:36 (UTC)
Goto Top
Naja hätte ja auch sein können das er die Möglichkeit vor lauter Brett vorm Kopp einfach nicht mehr gesehen hat face-smile.
Member: gmeurb
gmeurb Mar 25, 2022 at 11:31:31 (UTC)
Goto Top
Zitat von @Doskias:

Zitat von @1915348599:
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. face-wink

Genau so isses Doskias!