none
Powershell Skript zum Ordnerauslesen RRS feed

  • Frage

  • Hallo,

    ich habe folgenden Code und möchte, dass statt dem LastWriteTime(bzw LastAccessTime) der Ordner die LastWriteTime(bzw LastAccessTime) der jüngsten Datei in den jeweiligen Ordnern angegeben wird.

    Weiß jemand ob und wie das möglich wäre?

    Gruß Marvin

    # Get-DirStats.ps1
    # Written by Bill Stewart (bstewart@iname.com)
    # Outputs file system directory statistics.
    
    #requires -version 2
    
    <#
    .SYNOPSIS
    Outputs file system directory statistics.
    
    .DESCRIPTION
    Outputs file system directory statistics (number of files and the sum of all file sizes) for one or more directories.
    
    .PARAMETER Path
    Specifies a path to one or more file system directories. Wildcards are not permitted. The default path is the current directory (.).
    
    .PARAMETER LiteralPath
    Specifies a path to one or more file system directories. Unlike Path, the value of LiteralPath is used exactly as it is typed.
    
    .PARAMETER Only
    Outputs statistics for a directory but not any of its subdirectories.
    
    .PARAMETER Every
    Outputs statistics for every directory in the specified path instead of only the first level of directories.
    
    .PARAMETER FormatNumbers
    Formats numbers in the output object to include thousands separators.
    
    .PARAMETER Total
    Outputs a summary object after all other output that sums all statistics.
    #>
    
    [CmdletBinding(DefaultParameterSetName="Path")]
    param(
      [parameter(Position=0,Mandatory=$false,ParameterSetName="Path",ValueFromPipeline=$true)]
        $Path=(get-location).Path,
      [parameter(Position=0,Mandatory=$true,ParameterSetName="LiteralPath")]
        [String[]] $LiteralPath,
        [Parameter(Mandatory=$true)]
    [string]$dd, 
    [Parameter(Mandatory=$true)]
    [string]$mm,
    [Parameter(Mandatory=$true)]
    [string]$yyyy,
    [Parameter(Mandatory=$true)]
    [string]$lat,
        [Switch] $Only,
        [Switch] $Every,
        [Switch] $FormatNumbers,
        [Switch] $Total
    )
    
    begin {
      $ParamSetName = $PSCmdlet.ParameterSetName
      if ( $ParamSetName -eq "Path" ) {
        $PipelineInput = ( -not $PSBoundParameters.ContainsKey("Path") ) -and ( -not $Path )
      }
      elseif ( $ParamSetName -eq "LiteralPath" ) {
        $PipelineInput = $false
      }
    
      # Script-level variables used with -Total.
      [UInt64] $script:totalcount = 0
      [UInt64] $script:totalbytes = 0
    
      # Returns a [System.IO.DirectoryInfo] object if it exists.
      function Get-Directory {
        param( $item )
    
        if ( $ParamSetName -eq "Path" ) {
          if ( Test-Path -Path $item -PathType Container ) {
            $item = Get-Item -Path $item -Force
          }
        }
        elseif ( $ParamSetName -eq "LiteralPath" ) {
          if ( Test-Path -LiteralPath $item -PathType Container ) {
            $item = Get-Item -LiteralPath $item -Force
          }
        }
        if ( $item -and ($item -is [System.IO.DirectoryInfo]) ) {
          return $item
        }
      }
    
      # Filter that outputs the custom object with formatted numbers.
      function Format-Output {
        process {
          $_ | Select-Object Path,
            @{Name="Files"; Expression={"{0:N0}" -f $_.Files}},
            @{Name="Size"; Expression={"{0:N0}" -f $_.Size}}
        }
      }
    
      # Outputs directory statistics for the specified directory. With -recurse,
      # the function includes files in all subdirectories of the specified
      # directory. With -format, numbers in the output objects are formatted with
      # the Format-Output filter.
      function Get-DirectoryStats {
        param( $directory, $recurse, $format )
    
    if ($lat -eq "y" -or $lat -eq "ja" -or $lat -eq "j" -or $lat -eq "yes")
    {
        Write-Progress -Activity "Get-DirStats.ps1" -Status "Reading '$($directory.FullName)'"
        $files = $directory | Get-ChildItem -Force -Recurse:$recurse | Where-Object { -not $_.PSIsContainer }|where-object {$_.lastaccesstime -lt $yyyy+"-"+$mm+"-"+$dd}
          if ( $files ) {
          Write-Progress -Activity "Get-DirStats.ps1" -Status "Calculating '$($directory.FullName)'"
          $output = $files | Measure-Object -Sum -Property Length | Select-Object `
            @{Name="Path"; Expression={$directory.FullName}},
            @{Name="LastaccessTime"; Expression={$directory.lastAccesstime}},
            @{Name="Files"; Expression={$_.Count; $script:totalcount += $_.Count}},
            @{Name="Size"; Expression={$_.Sum; $script:totalbytes += $_.Sum}}
            
        }
        else {
          $output = "J:\Suchlogsps1\logjetzt.csv" | Select-Object `
            @{Name="Path"; Expression={$directory.FullName}},
            @{Name="LastaccessTime"; Expression={$directory.lastAccesstime}},
            @{Name="Files"; Expression={0}},
            @{Name="Size"; Expression={0}}
        }
        if ( -not $format ) { $output } else { $output | Format-Output }
    }
    else
    {
    if ($lat -eq "n" -or $lat -eq "Nein" -or $lat -eq "no")
    {
        Write-Progress -Activity "Get-DirStats.ps1" -Status "Reading '$($directory.FullName)'"
        $files = $directory | Get-ChildItem -Force -Recurse:$recurse | Where-Object { -not $_.PSIsContainer }|where-object {$_.lastwritetime -lt $yyyy+"-"+$mm+"-"+$dd}
        if ( $files ) {
          Write-Progress -Activity "Get-DirStats.ps1" -Status "Calculating '$($directory.FullName)'"
          $output = $files | Measure-Object -Sum -Property Length | Select-Object `
            @{Name="Path"; Expression={$directory.FullName}},
            @{Name="LastWriteTime"; Expression={$directory.lastwritetime}},
            @{Name="Files"; Expression={$_.Count; $script:totalcount += $_.Count}},
            @{Name="Size"; Expression={$_.Sum; $script:totalbytes += $_.Sum}}
        }
        else {
          $output = "J:\Suchlogsps1\logjetzt.csv" | Select-Object `
            @{Name="Path"; Expression={$directory.FullName}},
            @{Name="LastWriteTime"; Expression={$directory.lastwritetime}},
            @{Name="Files"; Expression={0}},
            @{Name="Size"; Expression={0}}
        }
        if ( -not $format ) { $output } else { $output | Format-Output }
    }
    }
    
    
      }
    }
    
    process {
      # Get the item to process, no matter whether the input comes from the
      # pipeline or not.
      if ( $PipelineInput ) {
        $item = $_
      }
      else {
        if ( $ParamSetName -eq "Path" ) {
          $item = $Path
        }
        elseif ( $ParamSetName -eq "LiteralPath" ) {
          $item = $LiteralPath
        }
      }
    
      # Write an error if the item is not a directory in the file system.
      $directory = Get-Directory -item $item
      if ( -not $directory ) {
        Write-Error -Message "Path '$item' is not a directory in the file system." -Category InvalidType
        return
      }
    
      # Get the statistics for the first-level directory.
      Get-DirectoryStats -directory $directory -recurse:$false -format:$FormatNumbers
      # -Only means no further processing past the first-level directory.
      if ( $Only ) { return }
    
      # Get the subdirectories of the first-level directory and get the statistics
      # for each of them.
      $directory | Get-ChildItem -Force -Recurse:$Every |
        Where-Object { $_.PSIsContainer } | ForEach-Object {
          Get-DirectoryStats -directory $_ -recurse:(-not $Every) -format:$FormatNumbers
        }
    }
    
    end {
      # If -Total specified, output summary object.
      if ( $Total ) {
        $output = "" | Select-Object `
          @{Name="Path"; Expression={"<Total>"}},
          @{Name="Files"; Expression={$script:totalcount}},
          @{Name="Size"; Expression={$script:totalbytes}}
        if ( -not $FormatNumbers ) { $output } else { $output | Format-Output }
      }
    }


    • Bearbeitet Marvin305 Mittwoch, 8. Januar 2014 14:01
    Mittwoch, 8. Januar 2014 13:56

Antworten

  • Hallo,

    das sollte helfen, erfordert PowerShell >= 3.0, bei 2.0 muesste man die get-childitem Zeilen anpassen.

    function Get-NewestFileforEachFolder {
        param (
            [parameter(Mandatory=$true)]
            [string]$Path,
            [parameter(Mandatory=$true)]
            [ValidateSet("LastWriteTime", "LastAccessTime")]
            [string]$Sort
        )
        $Folders = (Get-ChildItem $Path -Recurse -Directory).FullName
        foreach ($Folder in $Folders) {
            $Folder
            $File = @(Get-ChildItem $Folder -File | Sort-Object $Sort)[-1]
           if ($File) {
                "{0} {1}" -f $File.LastWriteTime, $File.Name 
            }
            else {
                "{0} {1}" -f "XX.XX.XXXX XX:XX:XX", "** Ordner enthaelt keine Dateien **" 
            }
        }
    }

    Aufruf z.B.::
    Get-NewestFileforEachFolder -Path F:\Scripte -Sort LastWriteTime

    In meinem Vorschlag fehlt aber der ein oder andere Vorteil, der in dem von Dir geposteten Script zu finden ist, weshalb dieses auch ein wenig laenger ist, aber z.B.: besser mit großen OrdnerStrukturen umgeht.

    Ich habe aber im Moment nicht die Zeit dieses anzupassen.

    Beste Gruesse
    brima


     
    • Bearbeitet brima Mittwoch, 8. Januar 2014 19:06
    • Als Antwort markiert Marvin305 Donnerstag, 9. Januar 2014 06:31
    Mittwoch, 8. Januar 2014 18:54
  • Hallo,

    bei mir funktioniert dein Code, aber du sortierst mit der Zeile $files = $Directory... die Dateien absteigend und hast so in $files die Dateien von neuesten zum aeltesten Zugriff sortiert.

    Mit der Zeile $o = $Directory... machst du das gleiche wieder aber aufsteigend und greifst hier nur die mit [-1] die letzte Datei ab, was wiederum die Datei mit dem neuesten Zugriff ist, die ist dir aber schon bekannt und entspricht $Files[0], somit ist die Zeile mit $o ueberfluessig, wie auch das nochmalige sotieren im if, das ist ja auch schon erledigt weil $files ja schon entsprechend sortiert wurde in der $files = ... Zeile


    if ($lat -eq "y" -or $lat -eq "ja" -or $lat -eq "j" -or $lat -eq "yes")
    {
        Write-Progress -Activity "Get-DirStats.ps1" -Status "Reading '$($directory.FullName)'"
        $files = $directory | Get-ChildItem -Force -Recurse:$recurse | 
        Where-Object { -not $_.PSIsContainer }|where-object {$_.lastaccesstime -lt $yyyy+"-"+$mm+"-"+$dd}|sort-object "lastaccesstime" -descending
        if ( $files ) {
          Write-Progress -Activity "Get-DirStats.ps1" -Status "Calculating '$($directory.FullName)'"
          $output = $files | Measure-Object -Sum -Property Length| Select-Object `
            @{Name="Path"; Expression={$directory.FullName}},
            @{Name="LastAccessTime"; Expression={$files[0].LastAccessTime}},
            @{Name="Files"; Expression={$_.Count; $script:totalcount += $_.Count}},
            @{Name="Size"; Expression={$_.Sum; $script:totalbytes += $_.Sum}}
            write-host $files
        }
    }

    Das sollte den Code schon mal schneller machen.

    Weil Du aber auch nicht den ganzen Code postet kann hier aber auch keiner mit Sicherher sagen was genau jetzt in $Directory steht, ich gehe davon aus genau ein Folder und niemand weis wie $Recurse gesetzt ist, ich gehe davon aus es steht auf $false, weil du das Ergebnis ja einzeln pro Ordner willst und nicht das neueste Datum fuer eine Ordnerstruktur, somit kannst Du auch jeweils  -Recurse:$recurse enfernen.

    Wenn auch so beim EXCEL Folder das LastAccesTime fehlt sollte man sich das Objekt (also die Datei mit dem juengsten Zugriff) genauer ansehen.
    Dazu einfach folgende Zeile im if einfuegen.

    $files[0] | Select-Object *

    Meoglicherweis liegt es am -force der dir ja auch Dinge zeigt die man "normal" nicht sieht wie man in deinem Beispiel schon schoen sieht J:\$RECYCLE.BIN


    Beste Gruesse
    brima


    • Als Antwort markiert Marvin305 Donnerstag, 16. Januar 2014 08:22
    Mittwoch, 15. Januar 2014 20:08
  • Vielen dank es läuft jetzt wie gewünscht :)

    if ($lat -eq "y" -or $lat -eq "ja" -or $lat -eq "j" -or $lat -eq "yes")
    {
        Write-Progress -Activity "Get-DirStats.ps1" -Status "Reading '$($directory.FullName)'"
        $files = $directory | Get-ChildItem -Force -Recurse:$recurse | 
        Where-Object { -not $_.PSIsContainer }|where-object {$_.lastaccesstime -lt $yyyy+"-"+$mm+"-"+$dd}|sort-object "lastaccesstime" -descending
        if ( $files ) {
        $a=$files.gettype()
          Write-Progress -Activity "Get-DirStats.ps1" -Status "Calculating '$($directory.FullName)'"
          $o=if($a.name -eq "Object[]"){$files[0].LastAccessTime}else{$files.LastAccessTime}
          $output = $files | Measure-Object -Sum -Property Length| Select-Object `
            @{Name="Path"; Expression={$directory.FullName}},
            @{Name="LastAccessTime"; Expression={$o}},
            @{Name="Files"; Expression={$_.Count; $script:totalcount += $_.Count}},
            @{Name="Size"; Expression={$_.Sum; $script:totalbytes += $_.Sum}}      
        }

    ich musste nur noch eine Abfrage reinbringen, damit das skript zwischen Ordnern mit nur einer Datei und ordnern mit mehreren Dateien unterscheidet ;)

    Gruß Marvin

    • Als Antwort markiert Marvin305 Donnerstag, 16. Januar 2014 10:58
    Donnerstag, 16. Januar 2014 08:21

Alle Antworten

  • Hallo,

    das sollte helfen, erfordert PowerShell >= 3.0, bei 2.0 muesste man die get-childitem Zeilen anpassen.

    function Get-NewestFileforEachFolder {
        param (
            [parameter(Mandatory=$true)]
            [string]$Path,
            [parameter(Mandatory=$true)]
            [ValidateSet("LastWriteTime", "LastAccessTime")]
            [string]$Sort
        )
        $Folders = (Get-ChildItem $Path -Recurse -Directory).FullName
        foreach ($Folder in $Folders) {
            $Folder
            $File = @(Get-ChildItem $Folder -File | Sort-Object $Sort)[-1]
           if ($File) {
                "{0} {1}" -f $File.LastWriteTime, $File.Name 
            }
            else {
                "{0} {1}" -f "XX.XX.XXXX XX:XX:XX", "** Ordner enthaelt keine Dateien **" 
            }
        }
    }

    Aufruf z.B.::
    Get-NewestFileforEachFolder -Path F:\Scripte -Sort LastWriteTime

    In meinem Vorschlag fehlt aber der ein oder andere Vorteil, der in dem von Dir geposteten Script zu finden ist, weshalb dieses auch ein wenig laenger ist, aber z.B.: besser mit großen OrdnerStrukturen umgeht.

    Ich habe aber im Moment nicht die Zeit dieses anzupassen.

    Beste Gruesse
    brima


     
    • Bearbeitet brima Mittwoch, 8. Januar 2014 19:06
    • Als Antwort markiert Marvin305 Donnerstag, 9. Januar 2014 06:31
    Mittwoch, 8. Januar 2014 18:54
  • Damit kann ich aufjedenfall was anfangen :) Vielen Dank!

    Donnerstag, 9. Januar 2014 06:31
  • Hallo,

    in dem Script ist noch ein kleiner Fehler.

    Dies Zeile

    "{0} {1}" -f $File.LastWriteTime, $File.Name

    sollte so geaendert werden.

    "{0} {1}" -f $File.$Sort, $File.Name

    so dass er auch wirklich das Datum anzeigt nach dem sortiert wird, ansonsten wuerde er zwar beim sortieren nach LastAccessTime alles richtig machen, aber von der gefunden Datei das LastWriteDatum ausgeben, durch die Aenderung wird das Datum ausgegeben nach dem auch sortiert wurde.

    Beste Gruesse
    brima

    Donnerstag, 9. Januar 2014 11:16
  • Ja das habe ich auch bemerkt, nur leider ist es mir irgendwie nicht möglich, das Ergebnis deines Skriptes in meins einzubauen :(

    z.B. hier

    if ($lat -eq "y" -or $lat -eq "ja" -or $lat -eq "j" -or $lat -eq "yes")
    {
        Write-Progress -Activity "Get-DirStats.ps1" -Status "Reading '$($directory.FullName)'"
        $files = $directory | Get-ChildItem -Force -Recurse:$recurse | Where-Object { -not $_.PSIsContainer }|where-object {$_.lastaccesstime -lt $yyyy+"-"+$mm+"-"+$dd}
          if ( $files ) {
          Write-Progress -Activity "Get-DirStats.ps1" -Status "Calculating '$($directory.FullName)'"
          $output = $files | Measure-Object -Sum -Property Length | Select-Object `
            @{Name="Path"; Expression={$directory.FullName}},
            @{Name="LastaccessTime"; Expression={$directory.lastAccesstime}},                    <--------müsste ja irgendwie ersetzt werden
            @{Name="Files"; Expression={$_.Count; $script:totalcount += $_.Count}},
            @{Name="Size"; Expression={$_.Sum; $script:totalbytes += $_.Sum}}
            
        }
        else {
          $output = "J:\Suchlogsps1\logjetzt.csv" | Select-Object `
            @{Name="Path"; Expression={$directory.FullName}},
            @{Name="LastaccessTime"; Expression={$directory.lastAccesstime}},
            @{Name="Files"; Expression={0}},
            @{Name="Size"; Expression={0}}
        }
        if ( -not $format ) { $output } else { $output | Format-Output }
    }

    wäre echt nett wenn du eventuell nocheinmal drübergucken könntest oder mir nen Tipp geben wie es geht ;-)

    Gruß Marvin

    Freitag, 10. Januar 2014 08:06
  • Hallo,

    ich tippe mal das die PowerShell noch Neuland fuer dich ist?

    Dein Script scheitert bereits in der 4 Zeile, dort vergleichst du Aepfel mit Birnen, du baust dort umstaendlich einen String aus dem Variablen $yyy $mm und $dd, das kannst auch so schreiben

    "$yyyy-$mm-$dd"

    Um Fehlerquellen zu vermeiden ist es IMHO sicherer mit einem DateTime-Objekt zu vergleichen.

    $myDate = Get-Date "$yyyy-$mm-$dd"
    Man kann mit der PowerShell auch Recht einfach mit dem Datum rechnen.

    Soll dein Script zb: Dateien aelter wie 45 Tage bearbeiten kannst Du das entsprechende Datum so bauen.

    $myDate = (Get-Date).AddDays(-45)

    Wenn ich mit meinem Tipp richtig liege suche mal hier im Forum nach Beitraegen von Peter Kriegel, dort findest Du in seiner Signatur zahlreiche Links zur PowerShell und auf Lernvideos die er mit viel Aufwand gemacht hat.

    Beste Gruesse
    brima








    • Bearbeitet brima Mittwoch, 15. Januar 2014 17:45
    Freitag, 10. Januar 2014 09:17
  • Das mit dem auslesen von den Zeiten klappt damit wunderbar bei Dateien, jedoch wurde hier in der Firma mal von jemandem ein Skript gestartet, wodurch alle Ordner LastWrite/AccessTimes vom 1.1.1601 bekommen, deswegen möchte ich das umändern, das Skript an sich läuft einwandfrei durch.

    Gruß Marvin

    Mittwoch, 15. Januar 2014 07:19
  • Hallo,

    also Eigenschaften eines Folders oder Files kannst du so nach deinen Wuneschen anpassen.

    (Get-Item e:\TestFolder).LastWriteTime = (get-date "2011-12-30")



    Hier wird dann zb.: die LastWriteTime des Folders TESTFOLDER auf den 30.12.2011 gesetzt!

    Beste Gruesse
    brima


    Mittwoch, 15. Januar 2014 12:44
  • Hi,

    ok.

    wenn du mir jetzt noch sagen kannst warum hier:

    if ($lat -eq "y" -or $lat -eq "ja" -or $lat -eq "j" -or $lat -eq "yes")
    {
        Write-Progress -Activity "Get-DirStats.ps1" -Status "Reading '$($directory.FullName)'"
        $files = $directory | Get-ChildItem -Force -Recurse:$recurse | 
        Where-Object { -not $_.PSIsContainer }|where-object {$_.lastaccesstime -lt $yyyy+"-"+$mm+"-"+$dd}|sort-object "lastaccesstime" -descending
        $o=($directory | Get-ChildItem -Force -Recurse:$recurse | 
        Where-Object { -not $_.PSIsContainer }|where-object {$_.lastaccesstime -lt $yyyy+"-"+$mm+"-"+$dd}|sort-object "lastaccesstime" )[-1]
        $i=$o.lastaccesstime
        
        if ( $files ) {
          Write-Progress -Activity "Get-DirStats.ps1" -Status "Calculating '$($directory.FullName)'"
          $output = $files | Measure-Object -Sum -Property Length| Select-Object `
            @{Name="Path"; Expression={$directory.FullName}},
            @{Name="LastAccessTime"; Expression={$i}},
            @{Name="Files"; Expression={$_.Count; $script:totalcount += $_.Count}},
            @{Name="Size"; Expression={$_.Sum; $script:totalbytes += $_.Sum}}
            $files|Sort-object -property "lastaccesstime" -descending 
            write-host $files
            
        }

    nur bei Ordnern mit mehr als einer Datei das Datum richitg ausgegeben wird dann bist du mein Retter!

    (hier die Ausgabe)

    Pfad                          LastAccessTime    Anzahl d. Dateien         Größe

    J:\EXCEL	                        1	        8833		
    J:\$RECYCLE.BIN	   29.11.2013 09:56	2	        13441	
    

    Gruß Marvin


    • Bearbeitet Marvin305 Mittwoch, 15. Januar 2014 13:12
    Mittwoch, 15. Januar 2014 13:09
  • Hallo,

    bei mir funktioniert dein Code, aber du sortierst mit der Zeile $files = $Directory... die Dateien absteigend und hast so in $files die Dateien von neuesten zum aeltesten Zugriff sortiert.

    Mit der Zeile $o = $Directory... machst du das gleiche wieder aber aufsteigend und greifst hier nur die mit [-1] die letzte Datei ab, was wiederum die Datei mit dem neuesten Zugriff ist, die ist dir aber schon bekannt und entspricht $Files[0], somit ist die Zeile mit $o ueberfluessig, wie auch das nochmalige sotieren im if, das ist ja auch schon erledigt weil $files ja schon entsprechend sortiert wurde in der $files = ... Zeile


    if ($lat -eq "y" -or $lat -eq "ja" -or $lat -eq "j" -or $lat -eq "yes")
    {
        Write-Progress -Activity "Get-DirStats.ps1" -Status "Reading '$($directory.FullName)'"
        $files = $directory | Get-ChildItem -Force -Recurse:$recurse | 
        Where-Object { -not $_.PSIsContainer }|where-object {$_.lastaccesstime -lt $yyyy+"-"+$mm+"-"+$dd}|sort-object "lastaccesstime" -descending
        if ( $files ) {
          Write-Progress -Activity "Get-DirStats.ps1" -Status "Calculating '$($directory.FullName)'"
          $output = $files | Measure-Object -Sum -Property Length| Select-Object `
            @{Name="Path"; Expression={$directory.FullName}},
            @{Name="LastAccessTime"; Expression={$files[0].LastAccessTime}},
            @{Name="Files"; Expression={$_.Count; $script:totalcount += $_.Count}},
            @{Name="Size"; Expression={$_.Sum; $script:totalbytes += $_.Sum}}
            write-host $files
        }
    }

    Das sollte den Code schon mal schneller machen.

    Weil Du aber auch nicht den ganzen Code postet kann hier aber auch keiner mit Sicherher sagen was genau jetzt in $Directory steht, ich gehe davon aus genau ein Folder und niemand weis wie $Recurse gesetzt ist, ich gehe davon aus es steht auf $false, weil du das Ergebnis ja einzeln pro Ordner willst und nicht das neueste Datum fuer eine Ordnerstruktur, somit kannst Du auch jeweils  -Recurse:$recurse enfernen.

    Wenn auch so beim EXCEL Folder das LastAccesTime fehlt sollte man sich das Objekt (also die Datei mit dem juengsten Zugriff) genauer ansehen.
    Dazu einfach folgende Zeile im if einfuegen.

    $files[0] | Select-Object *

    Meoglicherweis liegt es am -force der dir ja auch Dinge zeigt die man "normal" nicht sieht wie man in deinem Beispiel schon schoen sieht J:\$RECYCLE.BIN


    Beste Gruesse
    brima


    • Als Antwort markiert Marvin305 Donnerstag, 16. Januar 2014 08:22
    Mittwoch, 15. Januar 2014 20:08
  • Vielen dank es läuft jetzt wie gewünscht :)

    if ($lat -eq "y" -or $lat -eq "ja" -or $lat -eq "j" -or $lat -eq "yes")
    {
        Write-Progress -Activity "Get-DirStats.ps1" -Status "Reading '$($directory.FullName)'"
        $files = $directory | Get-ChildItem -Force -Recurse:$recurse | 
        Where-Object { -not $_.PSIsContainer }|where-object {$_.lastaccesstime -lt $yyyy+"-"+$mm+"-"+$dd}|sort-object "lastaccesstime" -descending
        if ( $files ) {
        $a=$files.gettype()
          Write-Progress -Activity "Get-DirStats.ps1" -Status "Calculating '$($directory.FullName)'"
          $o=if($a.name -eq "Object[]"){$files[0].LastAccessTime}else{$files.LastAccessTime}
          $output = $files | Measure-Object -Sum -Property Length| Select-Object `
            @{Name="Path"; Expression={$directory.FullName}},
            @{Name="LastAccessTime"; Expression={$o}},
            @{Name="Files"; Expression={$_.Count; $script:totalcount += $_.Count}},
            @{Name="Size"; Expression={$_.Sum; $script:totalbytes += $_.Sum}}      
        }

    ich musste nur noch eine Abfrage reinbringen, damit das skript zwischen Ordnern mit nur einer Datei und ordnern mit mehreren Dateien unterscheidet ;)

    Gruß Marvin

    • Als Antwort markiert Marvin305 Donnerstag, 16. Januar 2014 10:58
    Donnerstag, 16. Januar 2014 08:21
  • Hallo,

    so aus dem Bauch, kann es gerade nicht testen...

    Du koenntest dafuer sorgen, dass die Variable $files immer ein Array ist, eagal, ob keine, eine oder mehrere Files vorhanden sind, in dem du die entsprechende Zeile so aenderst:

    $files = @($directory | Get-ChildItem -Force -Recurse:$recurse | Where-Object { -not $_.PSIsContainer }|where-object {$_.lastaccesstime -lt $yyyy+"-"+$mm+"-"+$dd}|sort-object "lastaccesstime" -descending)

    Nun kanns Du ueber Count Eigenschaft ermitteln, um wieviele Dateien es geht, und du kannst aber auch bei nur einer Datei die "ArraySyntax" nutzen also:  $files[0].LastAccessTime

    $Files.Count
    Hoffe das hilft.

    Beste Gruesse
    brima


    • Bearbeitet brima Donnerstag, 16. Januar 2014 15:46
    Donnerstag, 16. Januar 2014 15:34