0

ネットワークの場所を検索する Powershell スクリプトを作成しています。ファイルが 2011 年または 2012 年に作成された場合は、ファイル名と、作成されたすべての 2011/12 ファイルの合計をログに書き込みます。

ファイル作成の日付と時刻を変換し、それを日付範囲と比較しようとすると、例外が発生します。

<#Checks one network location for files from 2011. 
gets the name of that file and adds to the count for 2011, then writes it to a log. 
Repeats for 2012.#>
    New-Item c:\users\logs\yearLog.txt -type file -force
    $path = "\\path"
    $log = "c:\users\log"
    $date2011 = "2011"
    $date2012 = "2012"
    write-progress -activity "Compiling Data" -status "Progress:"
    $x = 0
    "$date2011 files" | add-content $log

    Get-Childitem -Path $path -Recurse | Where-Object {$_.LastWriteTime -gt (12/31/2010) -AND $_LastWriteTime -lt (01/01/2012) |
    ForEach {
        $filename = $_.fullname
        $x++
        "$filename" | add-content $movelog
    }

    "$date2011 total files = $x" | add-content $log
    $x = 0
    "$date2012 files" | add-content $log

    Get-Childitem -Path $path -Recurse | Where-Object {$_.LastWriteTime -gt (12/31/2011) -AND $_LastWriteTime -lt (01/01/2013) |
    ForEach {
        $filename = $_.fullname
        $x++
        "$filename" | add-content $log
    }
    "$date2012 total files = $x" | add-content $log
}
}
4

1 に答える 1

1

主な問題: Where 句の中かっこのバランスが崩れており、パイプラインが壊れています。

追加の修正:

  • すでに DateTime オブジェクトがあるため、年を直接比較します
  • 文字列内の変数の書式設定を使用しました。インデックスを扱い始めると簡単になります
  • ForEach で -Begin 句を使用してカウンターを初期化する

とにかく、これは関数に変換された修正版で、任意のパス、年、およびログ出力フォルダーを選択できます

function YearLog {
    param(
        [Parameter(Mandatory=$true)][String]$Path,
        [Parameter(Mandatory=$true)][String]$LogFolder,
        [Parameter(Mandatory=$true)][Int]$Year
    )

    $log = '{0}\FileLog-{1}.txt' -f $LogFolder, $Year

    if(Test-Path -Path:$log) { 
        Remove-Item -Force -Path:$log 
    }

    'Files Found for {0}:' -f $Year | add-content $log

    Get-Childitem -Path $Path -Recurse | 
        Where-Object { ($_.LastWriteTime.Year -gt ($Year-1)) -AND ($_.LastWriteTime.Year -lt ($Year+1)) } |
        ForEach -Begin { $x = 0 } -Process {
            $x++ | Out-Null
            $_.FullName | add-content $log
        }

    'Total Found for {0}: {1}' -f $year, $x  | add-content $log
    'Log written for items in {0} for {1}: {2}' -f $Path, $Year, $log | Write-Host 
}

<# Usage:     
   YearLog -Path:$ENV:ProgramFiles -LogFolder:$ENV:TEMP -Year:2012
#>
于 2013-07-18T02:37:44.373 に答える