所以正如标题所说,我想检查一个特定文件(总是同名)的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:错误中指出的行和列可能有点错误,因为我更改了帖子的名称。
1条答案
按热度按时间x7yiwoj41#
根据您尝试执行的操作的 * 描述 * 判断,您可能正在寻找类似下面的内容(日志记录代码省略):
注:上述命令中的
-WhatIf
公共参数 * 预览 * 操作。删除-WhatIf
,并在确定操作将执行所需操作后重新执行。至于你所尝试的:
ForEach-Object
调用存在 * 语法问题 *,原因是**忽略了将参与if
-语句条件的管道包含在分组运算符(...)
**中;以下是更正后的语法,其格式便于阅读:(...)
中,在 * 表达式 * 的上下文中需要包含管道(包括对 * 单个命令 * 的调用),这源于PowerShell的两种基本解析模式:* 参数模式 * 和 * 表达式模式***-请参见this answer以获得详细解释,以及about_Parsing概念帮助主题。