WindowsPower Shell脚本未按预期运行

时间:2019-01-22 15:21:45

标签: shell powershell powershell-v2.0 powershell-v3.0

大家好,我有需要删除90天以前的旧文件的脚本。对于90天脚本来说,问题没有时间计算可以正常工作。如果我们在检查时间范围的条件时添加条件:90天无法正常工作。

我有一个特定的文件夹,其中包含脚本下面的子文件夹,而不是删除子文件夹脚本下的文件的子文件夹,而仅指定删除其子文件夹文件的文件夹。

我们有要求的Power Shell脚本,该脚本应删除90天之前的文件,并且还应删除子文件夹下的文件。

任何人都可以建议对以下脚本进行任何更改

Get-ChildItem -Path "D:\samples\" -Include *.* -Recurse -Force | where CreationTime -lt (Get-Date).AddDays(-10) | foreach {$_.Delete()}

2 个答案:

答案 0 :(得分:1)

您的| where需要大括号{}$_引用该对象。使用该代码,您的代码将如下所示:

Get-ChildItem -Path "D:\samples\" -file -Recurse -Force | where {$_.CreationTime -lt (Get-Date).AddDays(-10)} | foreach {$_.Delete()}

注意:我将-Include "."替换为-file以包括所有文件。这至少需要Powershell 3.0版。使用$Host

检查版本

答案 1 :(得分:0)

您使用的几个Powershell标签(通常相互排斥)含糊不清,
如果要确保脚本可在PSv2下运行,请仅使用该标记。

Remove-Item cmdlet直接接受管道输入,因此我将使用它代替ForEach-Object和对象.delete()方法。

-File参数需要PSv3 +,替代方法是检查(not = {!$_.PSIsContainer

该脚本使IMO更易于阅读,其中PowerShell希望延续和缩进的折线如下:

## Q:\Test\2019\01\22\SO_54311383.ps1
$BasePath = "D:\samples\*"
$Treshold = (Get-Date).Date.AddDays(-10)

Get-ChildItem -Path $BasePath -Recurse -Force |
    Where-Object {!$_.PSIsContainer -and
                  $_.CreationTime -lt $Treshold} |
        Remove-Item  -WhatIf # -Force

如果输出看起来正常,请删除最后一行中的-WhatIf
暂时将最终必要的-Force参数注释掉了。