tray-park
Goto Top

PowerShell - Nach Dateigröße selektieren

Exchange 2010 Standard
Server 2008 R2 Enterprise

Hi,

ich schreibe gerade ein kleines PowerShell Skipt.

Dieses soll die Namen und Größen der Dateien aus mehreren Unterordnern ausgeben, die z.B. kleiner als 500 MB sind und diese dann samt Ordner auf ein anderes Laufwerk verschieben.
$pfad=Get-ChildItem *.* -Recurse | select-object name, length | format-list | where name -lt 524288000

Der ganze Move-Item Vorgang folgt dann später.

Wisst ihr, wie ich hier gescheit selektieren kann?

Freue mich über jede Rückmeldung.

Grüße


Tray

Content-ID: 146449

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

Ausgedruckt am: 08.11.2024 um 09:11 Uhr

77559
77559 07.07.2010 um 21:05:12 Uhr
Goto Top
Hallo Tray,
gci *.* -recurse | foreach {if (!$_.psiscontainer -And $_.length -lt '10000') {write-host $_.length $_.fullname $_.PSDrive $_.DirectoryName.substring(2) $_.BaseName $_.Extension} }
Statt Write-Host bau halt deinen Befehl zusammen.

Gruß
LotPings

Edit: noch ein paar Anmerkungen
  • Damit der gci -recurse funktioniert nimm bitte nur "*" als Auswahl, mit "*.*" geht es nicht.
  • Wenn du später in der Pipe auf den vollen Dateinamen zugreifen willst, darfst du ihn nicht vorher wegselektieren.

Wenn du in der Pipe noch mehr anstellen willst, kannst du das z.Bsp. so machen:
gci * -recurse | where -filterscript {!$_.psiscontainer -And $_.length -lt '500000000'} | ft -auto
tray-park
tray-park 08.07.2010 um 08:30:28 Uhr
Goto Top
Hi,

danke für die rasche Antwort. Das werde ich gleich versuchen.

Wo bekomme ich eigentlich Infos zu den ganzen möglichen Methoden her?
Also ich meine diese
.....$_.psiscontainer, $_.length .....
MS Technet berichtet ja nur von den CMDlet´s
tray-park
tray-park 08.07.2010 um 10:39:51 Uhr
Goto Top
Coole Sache.

Ich hab jetzt statt dem Write-Host und den folgenden Anweisungen versucht die selektierten Dateien zu verschieben.
	gci $quelle * -recurse | foreach {
		if (!$_.psiscontainer -And $_.length -lt '10000')   
		{
			# Write-Host $_.length $_.fullname
			$daten=Get-ChildItem $quelle * -Recurse
			Move-Item $daten -Destination $ziel
		}
		else
		{
			Write-Host "Hat nicht geklappt"  
		}
	}	

Das funktioniert aber leider nicht so wirklich. Irgendwie muss ich ja die Selektion in ner Variablen einlesen und der Move-Item Anweisung übergeben.

Wie bekomm ich das hin?
77559
77559 08.07.2010 um 10:42:54 Uhr
Goto Top
Zitat von @tray-park:
MS Technet berichtet ja nur von den CMDlet´s
Eins davon hilft dir dabei: Get-Member
Ans Ende der Pipe gehängt, zeigt es dir Methoden und Eigenschaften an.

Gruß
LotPings
77559
77559 08.07.2010 um 11:36:20 Uhr
Goto Top
Zitat von @tray-park:
Wie bekomm ich das hin?
Indem du als Quelle nicht zwei unabhängige Werte angibst, sondern einen
Ich glaube du hast nicht verstanden was der foreach macht.
Der verarbeitet doch jedes aus der Pipe kommende Objekt separat.
Deine Zeile 5 fängt aber wieder von vorne an.
Den kompletten Namen des Quellobjekts hast du doch in $_.fullname, wenn du jetzt einen Teil-Quell-Pfad mit in den Zielpfad einbauen willst, habe ich hier 2 alternative methoden eingebaut.
(Ausserdem zeige ich testhalber den Move nur mit Write-Host an)
$Quelle = "D:\Test\2009\"  
$ZielBasis = "X:"  
gci $Quelle -recurse | foreach {
  if (!$_.psiscontainer -And $_.length -lt '10000')   
  {
#    $Ziel = $ZielBasis + $_.DirectoryName.substring(2)
     $Ziel = $_.FullName.replace($Quelle ,$ZielBasis + "\")  

    Write-Host Move-Item $_.FullName -Destination $Ziel
  }
  else
  {
    Write-Host $_.length $_.FullName "Entspricht nicht den Kriterien"  
  }
}

Gruß
LotPings

PS: Der Text im Else-Zweig war Unsinn.
tray-park
tray-park 09.07.2010 um 09:26:41 Uhr
Goto Top
Die Ausgabe zeigt mir die richtigen Pfade, aber nach dem Löschen von Write-Host funktioniert der Move nicht.
77559
77559 09.07.2010 um 10:36:37 Uhr
Goto Top
Hallo tray,

es wäre schon hilfreich wenn du die Fehlermeldung weitergibst.
Man kann/will nicht immer alle Aspekte in der eigenen Umgebung testen.
Und warum soll ich mir mehr Mühe beim Finden des Fehlers machen als du selbst?

Versuche mal diese Version, sie erstellt ein nicht vorhandene Zielverzeichnis vor dem Move:
$Quelle = "D:\Test\2009\"  
$ZielBasis = "D:\Test\2009.x\"  
gci $Quelle -recurse | foreach {
  if (!$_.psiscontainer -And $_.length -lt '100')   
  {
     $Ziel = $_.DirectoryName.replace($Quelle ,$ZielBasis )
     if (!(test-path $Ziel)) {mkdir $Ziel}
#     Write-Host Move-Item -path $_.FullName -Destination $Ziel
     Move-Item -path $_.FullName -Destination $Ziel
  }
}

Gruß
LotPings
tray-park
tray-park 09.07.2010 um 10:47:18 Uhr
Goto Top
Ich versuchs mal.

Ich hätte ne Fehlermeldung gepostet, wenn es eine gäbe.