2017-04-17 10 views
1

Powershellスクリプトを使用して、少なくともX日以上経過したファイルを削除します。私はそれを削除する前にファイルを印刷するように変更する方法を私は思っていた。スクリプトは、このためにファイルの名前/パスを削除する前に印刷するにはどうすればよいですか?

$limit = (Get-Date).AddDays(-45) 
$path = "\\noc2-storage\IT_Backup\Daily_SQL\"            #" 

# Delete files older than the $limit. 
echo "Deleting files: " 
Get-ChildItem -Path $path -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item -Force 


# Delete any empty directories left behind after deleting the old files. 
Get-ChildItem -Path $path -Recurse -Force | Where-Object { $_.PSIsContainer -and (Get-ChildItem -Path $_.FullName -Recurse -Force | Where-Object { !$_.PSIsContainer }) -eq $null } | Remove-Item -Force -Recurse 
+0

「印刷」を定義する - 画面に出力するか、実際にはコピーを作成しますか? –

+0

が画面に出力されます – kevorski

答えて

2

最も簡単な方法 - とapplicably一般ある一つは - にある-Verbosecommon parameterを使用します。PSV3 +であなたがGet-ChildItem-Filesスイッチを使用することにより、多少これを簡素化することができ

Write-Verbose -Verbose "Deleting files:" 
Get-ChildItem -Path $path -Recurse -Force | 
Where-Object { ! $_.PSIsContainer -and $_.CreationTime -lt $limit } | 
    Remove-Item -Force -Verbose 

注意をこれはファイルに出力を直接制限するだけで、Where-Objectの呼び出しを簡略化して、という比較ステートメントを呼び出します。

すなわち、 は予行演習を実行するために - - あなただけが削除されるものエコーしたい場合
Write-Verbose -Verbose "Deleting files:" 
Get-ChildItem -File -Path $path -Recurse -Force | 
Where-Object CreationTime -lt $limit | 
    Remove-Item -Force -Verbose 

ではなく-Verboseの、Remove-Item-WhatIf共通パラメータを使用しています。


はまた、私はWrite-Verbose -Verbose "Deleting files:"echo "Deleting files: "を交換してきたことに注意してください。 PowerShellで

echoは出力データが行くことを意図しているところである成功ストリーム、への書き込みをWrite-Outputの別名です。

言っ
"Deleting files: " # implicitly output the string to the success stream 

状況上記のようなメッセージがないが所属行います

は実際には、そのストリームへの書き込みはので、あなたのコマンドはちょうどように簡略化することができ、デフォルトアクションです成功ストリームでは、別のストリームを使用して冗長出力が1つのオプションです。

Write-Verbose -Verboseは、明示的にそのような詳細な出力を生成するが、通常の機構は、冗長出力は、図示するか否かの機能/レットの-Verbose共通パラメータまたは$VerbosePreference嗜好変数が運転させることです。

+0

この回答ありがとうございます。いくつのファイルが削除されたかを示すメッセージを追加したいと思います。このオプションをスクリプトに追加する簡単な方法はありますか?ファイルが削除されている場合は、+1に+1を加えます。 – kevorski

+1

@kevorski: '-ov files'(' -OutVariable files')を 'Where-Object'呼び出しに追加すると、すべてのターゲットファイルに関する情報が' $ files'コレクションに保存されます。 '$ files.Count'は、対象となったファイルの数を示します。あなたのフォローアップの質問に完全に答えられない場合は、_new_質問を投稿してください(私にここで通知してください)。 – mklement0

0

です - あなたはすでにかなり簡単に持ってコマンドを変更することができます。

$limit = (Get-Date).AddDays(-45) 
$path = "\\noc2-storage\IT_Backup\Daily_SQL\" 

# Delete files older than the $limit. 
$files = Get-ChildItem -Path $path -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } 
ForEach ($file in $files) { 
    Write-Verbose -Verbose "Deleting: $file" 
    Remove-Item -force $file 
} 


# Delete any empty directories left behind after deleting the old files. 
Get-ChildItem -Path $path -Recurse -Force | Where-Object { $_.PSIsContainer -and (Get-ChildItem -Path $_.FullName -Recurse -Force | Where-Object { !$_.PSIsContainer }) -eq $null } | Remove-Item -Force -Recurse 
+0

PSv5が 'Write-Host' _less_ [harmful](http://www.jsnover.com/blog/2013/12/07/write-host-considered-harmful/)をその出力を抑止/キャプチャする機能)、これを含むほとんどの場合に使用するのは依然として間違ったツールです。 – mklement0

+0

チップをありがとう! write-hostの代わりにwrite-verboseを使うようにスクリプトを変更しました。 Write-VerboseがWrite-Hostよりも優れている理由について、便利なリンクがありますか? –

+0

すべてのコマンドレットは '-Verbose'を直接サポートしているので、' ForEach-Object'の必要はありません。これは '-Verbose'共通パラメータがフリーでステータス出力を与えるためです。あまりにも多くの情報を提供しない['Write-Verbose'ヘルプページ(https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.utility/write-verbose)しかし、概念的な情報。私がすでにリンクしているブログ記事にはより多くの情報があり、[この回答](http://stackoverflow.com/a/40034706/45375)には 'Write-Host'があります。 – mklement0

0

ファイル名を印刷したいと、ファイルの内容を印刷しないと仮定すると: はあなたがRemove-Item-verboseを渡してみましたがありますか?

関連する問題