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