2017-04-18 10 views
2

all。PowerShell:スクリプトは最終更新日から30歳を超えたファイルをカウントしません

私は立ち往生しています。 PowerShellスクリプトでは、最終更新日から30日以上経過したファイルを特定のフォルダに表示します(存在しない場合はフォルダを作成します)。それはフォルダを作成し、それは私に合計ファイルを与えます、それはテストクエリのすべてのファイルを一覧にしますが、実際に30 +日の古いファイルの数を数えません。私はこの数を得るためにいくつかの方法を試しましたが(このサイトから古いファイルを削除する他の解決法から派生したものもあります)、PowerShellはそれをしたくありません。

は、ここで私は何の結果を得ないだろう、

$HomePath = $env:USERPROFILE 
$CompanyFolder = "\Company" 
$TimeSensativeFolder = "\TimeSensative" 
$TimeSensativePath = $HomePath+$CompanyFolder+$TimeSensativeFolder 
$OldFilesAmount = 0 
$TotalFilesAmount = 0 
$TimeLimit = (Get-Date).AddDays(-30) 
$StatusOK = "No old files were found in the time sensative folder." 
$StatusCreated = "The time sensative folder was created." 
$StatusError1 = "There were old files found in the time sensative folder!" 
$StatusError2 = "Unable to create the time sensative folder!" 

function MakeTimeSensativeFolder ($TimeSensativePath) { 
    try { 
     md $TimeSensativePath -Force -ErrorAction Stop 
     Write-Host $StatusCreated 
    } 
    catch { 
     Write-Host $StatusError2 
    } 
} 

function CountOldFiles() { 
    $OldFilesAmount = $OldFilesAmount + 1 
} 

if(!(Test-Path $TimeSensativePath -PathType Container)) { 
    MakePHIFolder $TimeSensativePath 
} 
else { 

} 

try { 
    $TotalFilesAmount = (Get-ChildItem $PHIPath -Recurse -File | Measure-Object).Count 

    # I've tried this... 
    Get-Item $PHIPath | Foreach {$_.LastWriteTime} -ErrorAction Stop 
     if (Get-Content $_.LastWriteTime | Where-Object {$_ -gt $TimeLimit}) { 
       CountOldFiles 
     } 

    # And I've tried this... 
    Get-ChildItem -Path $PHIPath -Recurse -File | Foreach-Object { 
     if (Get-Content $_.LastWriteTime | Where-Object {$_ -gt $TimeLimit}) { 
      CountOldFiles 
     } 
    } 

    # I've even tried this... 
    Get-ChildItem $PHIPath -Recurse -File | ? { 
     -not $_.PSIsContainer -and $_.LastWriteTime -lt $TimeLimit 
    } | CountOldFiles 

    # And this, as well... 
    Get-ChildItem -Path $PHIPath -Recurse -File | Where-Object {$_.LastWriteTime -gt $TimeLimit} | CountOldFiles 

} 
catch { 
    MakeTimeSensativeFolder $TimeSensativePath 
} 

# Used for testing. 
<# 
Get-ChildItem $TimeSensativePath -Recurse -File 
Write-Host "TimeSensative folder exists:" $TimeSensativePathExists 
Write-Host "Home TimeSensative path:" $TimeSensativePath 
Write-Host "Old files found:" $OldFilesAmount 
Write-Host "Total files found:" $TotalFilesAmount 
Exit 
#> 

# Determining proper grammar for status message based on old file count. 
if ($OldFilesAmount -eq 1) { 
    $StatusError1 = "There was "+$OldFilesAmount+" old file of "+$TotalFilesAmount+" total found in the PHI folder!" 
} 
if ($OldFilesAmount -gt 1) { 
    $StatusError1 = "There were "+$OldFilesAmount+" old files of "+$TotalFilesAmount+" total found in the PHI folder!" 
} 

# Give statuses. 
if ($OldFilesAmount -gt 0) { 
    Write-Host $StatusError1 
} 
else { 
    Write-Host $StatusOK 
} 

は、私が試したかに応じて...これまでの私のコードだか、私はこのような何かを取得したい:いずれの場合においても

Get-Content : Cannot find drive. A drive with the name '12/22/2016 17' does not exist. 
At C:\Users\nobody\Scripts\PS1\ts_file_age.ps1:54 char:14 
+   if (Get-Content $_.LastWriteTime | Where-Object {$_ -gt $Tim ... 
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     + CategoryInfo   : ObjectNotFound: (12/22/2016 17:String) [Get-Content], DriveNotFoundException 
     + FullyQualifiedErrorId : DriveNotFound,Microsoft.PowerShell.Commands.GetContentCommand 

を、私が要求するように努力しているので、古いファイル数はありません。

これはちょっと頭の傷つき者です。何かアドバイス?

ありがとうございます!

+1

スペルにジャストaisde:http://www.dictionary.com/browse/sensitive – gvee

答えて

1

最後の書き込み時間でファイルをフィルタするのは簡単です。同様に、

ここで行われることは、すべてのファイルがコレクションに設定されていることです。これは必須ではありませんが、コレクションがブラウズされて正しく挿入されているかどうかを確認できます。これは、複雑なパスまたは除外フィルタがある場合に便利です。

2番目の手順は、後でファイルを古いものと新しいものに分割するために使用するDateTimeを取得することです。サンプルのように、ここでは面白いものはありません。実際、小さなことが1つあります。日付は-30日ですが、時間、分、秒は現在の時刻に基づいています。だから実際にはきつい制限がある場合は、真夜中の時間を使用することを検討してください。([datetime]::Today).AddDays(-30)

3番目のステップは、新しいファイルと古いファイルの2つの空のコレクションを宣言することです。

最後のステップは、$allFilesを繰り返して最後の書き込み時間を確認することです。カットポイント以上の場合は$newFiles、それ以外の場合は$OldFilesに追加してください。

最後のステップの後、さらに処理するだけで十分です。 X日より古い

+0

ニース!次に、$ OldFilesAmount = $ oldFiles.Countを実行して、作成する配列から出力する必要があるカウントを取得できます。これは素晴らしいです!とても有難い。 –

-1

これは私が(この場合は削除)を取得するために何をすべきかですファイル:

$Days = 5 
$limit = (Get-Date).AddDays(-$Days) 
$CurrentDate = Get-Date 

#This will delete all files older than 5 days 

Get-ChildItem -Path $Workdir -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.LastWriteTime -lt $limit } | Remove-Item -Force 
+0

'$ Daysback'は決して設定されず、' $ DatetoDelete'は決して使用されないので、このスニペットはいくらかのリファクタリングを使うことができます。 – vonPryz

+0

ファイルを削除しようとしていません。私はそれを例えば私が使った例を使って使っていました。私は古いファイルの数を出力するために探しています。 –

+0

'Remove-Item'ではなく、角括弧を使って' .Count'を追加するだけです –

関連する問題