windows POWERSHELL -检查文件A的最后写入时间,如果文件A超过50天,则删除文件夹的内容

hgb9j2n6  于 2023-03-04  发布在  Windows
关注(0)|答案(1)|浏览(158)

所以正如标题所说,我想检查一个特定文件(总是同名)的LastWriteTime,如果该文件超过50天,我想删除一个文件夹(它旁边的)的内容。
可以有2种路径类型,结构如下:

D:\Server\Azerty\BAL\*\CE
D:\Server\WARRIOR\*\Azerty\BAL\*\CE

"*"在这里是因为有几个文件夹具有不同的名称。我想检查LastWriteTime的文件名是"Olympe"。我想删除内容的文件夹名为"CE"(见上面的路径)。
我尝试了很多东西,我用完了主意,所以我在这里寻求帮助。
下面是我的代码:

$Folder1 = "D:\Server\Azerty\BAL\*\CE"
$Folder2 = "D:\Server\WARRIOR\*\Azerty\BAL\*\CE"
$pathlogs = "D:\Server\Script\Purge\logs"
$Date = (get-date).ToString("yyyyMMdd-HHmmss")

If((Test-Path $Folder1))
{
    $olympe1 = Get-ChildItem -Path "D:\Server\Azerty\BAL\*\Olympe" 
    $age1 = (Get-Date) - ($olympe1.LastWriteTime)
    if($age1.Days -gt 50) 
    {
        #Logs
        Get-ChildItem -Path $flagcomm1 |
        Where-Object {!$_.PSIsContainer} | Select-Object -Property FullName | Out-File $pathlogs\$Date-Purge.txt -Append
        #Suppression
        Get-ChildItem -Path $Bal1 |
        Where-Object {!$_.PSIsContainer} |
        ForEach-Object {
            Remove-Item -Force -Recurse
        }
    }
}

elseif((Test-Path $Folder2))
{
$olympe2 = Get-ChildItem -Path "D:\Server\WARRIOR\*\Azerty\BAL\*\Olympe"
#$age2 = [datetime](Get-Date).ToUniversalTime() - [datetime]($flagcomm2.LastWriteTime | Select-Object -First 1 | ForEach-Object {$_.ToUniversalTime()})
if($olympe2.LastWriteTime | Select-Object -First 1 |
    ForEach-Object {$_.ToUniversalTime()} -lt (Get-Date).AddDays(-50).ToUniversalTime())
{
    Get-ChildItem -Path $Folder2 -Recurse |
    Where-Object {$_.LastWriteTime.ToUniversalTime() -lt (Get-Date).AddDays(-50).ToUniversalTime()} |
    ForEach-Object {
        Remove-Item -Force -Recurse
    }
}
else {   
}
}

我最后一次尝试是在elseif上,因为这是我的测试用例。
在此,我得到了这个错误:

ForEach-Object : Cannot bind parameter 'RemainingScripts'. Cannot convert the "-lt" value of type "System.String" to type "System.Management.Automation.ScriptBlock".
At D:\Server\ScriptPurge_ALL - Copy.ps1:34 char:5
+     ForEach-Object {$_.ToUniversalTime()} -lt (Get-Date).AddDays(-50) ...
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [ForEach-Object], ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.ForEachObjectCommand

我很高兴能得到一些帮助:)
PS:错误中指出的行和列可能有点错误,因为我更改了帖子的名称。

x7yiwoj4

x7yiwoj41#

根据您尝试执行的操作的 * 描述 * 判断,您可能正在寻找类似下面的内容(日志记录代码省略):

$testFileName = 'Olympe'
$siblingFolderName = 'CE'
$paths = 
  'D:\Server\Azerty\BAL\*', 'D:\Server\WARRIOR\*\Azerty\BAL\*' |
  ForEach-Object { Join-Path $_ $testFileName }
$dateThreshold = (Get-Date).Date.ToUniversalTime().AddDays(-50)

Get-ChildItem $paths |
  Where-Object LastWriteTimeUtc -lt $dateThreshold |
  ForEach-Object {
    # Find the path of the sibling folder with name $siblingFolderName
    $targetFolderPath = Join-Path $_.DirectoryName $siblingFolderName
    Get-ChildItem -File $targetFolderPath | Remove-Item -Force -WhatIf
  }

注:上述命令中的-WhatIf公共参数 * 预览 * 操作。删除-WhatIf,并在确定操作将执行所需操作后重新执行。
至于你所尝试的

  • 错误消息指出ForEach-Object调用存在 * 语法问题 *,原因是**忽略了将参与if-语句条件的管道包含在分组运算符(...)**中;以下是更正后的语法,其格式便于阅读:
if (
  # Enclose the pipeline in (...), so it can be used as the LHS of
  # the -lt operator.
  (
    $olympe2.LastWriteTime | 
      Select-Object -First 1 | 
      ForEach-Object { $_.ToUniversalTime() }
  ) -lt (Get-Date).AddDays(-50).ToUniversalTime()
) { # ...
  • 顺便说一句,您本可以将条件简化为以下形式,从而避免使用嵌套管道:
if (
  $olympe2.LastWriteTime[0].ToUniversalTime() -lt (Get-Date).AddDays(-50).ToUniversalTime()
) { # ...
  • (...)中,在 * 表达式 * 的上下文中需要包含管道(包括对 * 单个命令 * 的调用),这源于PowerShell的两种基本解析模式:* 参数模式 * 和 * 表达式模式***-请参见this answer以获得详细解释,以及about_Parsing概念帮助主题。

相关问题