2017-04-17 82 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

最簡單的方法 - 和一個是一般可適用 - 是使用-Verbosecommon parameter

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

注意,在PSv3 +,你可以在某種程度上使用-Files交換機Get-ChildItem簡化這個,這直接限制了輸出到文件只,這然後允許Where-Object呼叫的簡化到一個所謂的比較語句

Write-Verbose -Verbose "Deleting files:" 
Get-ChildItem -File -Path $path -Recurse -Force | 
Where-Object CreationTime -lt $limit | 
    Remove-Item -Force -Verbose 

如果你只呼應什麼被刪除 - 即執行試運行 - 使用-WhatIf通用參數Remove-Item,而不是-Verbose


另外請注意,我把它換成echo "Deleting files: "Write-Verbose -Verbose "Deleting files:"

在PowerShell中,echoWrite-Output一個別名,它寫入成功流,這是在輸出數據意味着去。

事實上,寫入該流是默認行動,所以你的命令可能只被簡化:

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

這就是說,狀態消息,如上面做屬於在成功流,並使用單獨的流爲詳細輸出是一種選擇。

Write-Verbose -Verbose顯式生成如此詳細的輸出,但通常的機制是讓功能/ cmdlet的通用參數或$VerbosePreference首選變量驅動是否應顯示詳細輸出。

+0

謝謝你的回答。我想添加一條消息,說明有多少文件已被刪除。有沒有簡單的方法可以將此選項添加到腳本中;如果某個文件已被刪除,請將+1添加到計數中。 – kevorski

+1

@kevorski:如果將'-ov files'('-OutVariable files')添加到'Where-Object'調用中,則有關所有目標文件的信息將保存在$ files文件集中。 '$ files.Count'會告訴你有多少文件被定位。如果這不能完全回答您的後續問題,請發佈一個新的問題(並隨時通知我)。 – 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_ [有害](http://www.jsnover.com/blog/2013/12/07/write-host-considered-harmful/)抑制/捕獲其輸出的能力),但在大多數情況下仍然是錯誤的工具,包括這個。 – mklement0

+0

感謝您的提示!我已經將腳本更改爲使用write-verbose而不是write-host。爲什麼Write-Verbose優於Write-Host?有什麼有用的鏈接嗎? –

+0

所有cmdlet都直接支持'-Verbose',所以不需要'ForEach-Object' - 這是避免Write-Host的另一個原因,因爲'-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

假設你要打印的文件名,不希望打印的文件內容: 你試過路過-verboseRemove-Item