如何用PowerShell获取含当日Error文件的根日志目录子文件夹名称
PowerShell脚本:获取符合条件的一级子文件夹名称
你需要的是C:\Errorlogs下的直接子文件夹名称,要求这些子文件夹的子目录中存在当日修改、名称含Error的文件。以下是两种可行的实现方案:
方案一:先遍历一级子文件夹,再检查内部文件
这种方法先定位根目录下的所有直接子文件夹,再逐个检查是否存在符合条件的文件,效率更高(找到一个符合条件的文件就停止当前子文件夹的遍历):
$targetDir = "C:\Errorlogs" # 获取根目录下的所有直接子文件夹,筛选出包含目标文件的文件夹 Get-ChildItem -Path $targetDir -Directory | Where-Object { # 检查当前子文件夹下是否存在当日修改、名称含Error的文件 $hasValidFile = Get-ChildItem -Path $_.FullName -Recurse -Filter "*Error*" -File -ErrorAction SilentlyContinue -Force | Where-Object { $_.LastWriteTime.Date -eq [datetime]::Today.Date } | Select-Object -First 1 $hasValidFile -ne $null } | Select-Object -ExpandProperty Name
代码说明:
Get-ChildItem -Path $targetDir -Directory:仅获取根目录下的直接子文件夹,避免递归遍历所有内容- 内部的
Get-ChildItem递归查找当前子文件夹下的文件,用Filter筛选名称含Error的文件,再通过Where-Object判断修改日期是否为当日 Select-Object -First 1:找到第一个符合条件的文件就停止,减少不必要的遍历- 最后提取符合条件的子文件夹的
Name属性,得到目标名称
方案二:从符合条件的文件路径中提取一级子文件夹
如果已经找到所有符合条件的文件,也可以从文件路径中拆分出一级子文件夹名称,再去重:
$targetDir = "C:\Errorlogs" Get-ChildItem $targetDir -Recurse -ErrorAction SilentlyContinue -Force -Filter "*Error*" -File | Where-Object { $_.LastWriteTime.Date -eq [datetime]::Today.Date } | # 拆分文件路径,提取一级子文件夹名称 ForEach-Object { # 去掉根目录路径,拆分剩余部分为路径段 $relativePath = $_.FullName.Substring($targetDir.Length + 1) $pathSegments = $relativePath -split '\\' $pathSegments[0] } | Sort-Object -Unique
代码说明:
- 先通过递归找到所有符合条件的文件
- 对每个文件的完整路径,去掉根目录部分后拆分路径段,第一个段就是一级子文件夹名称
Sort-Object -Unique:确保同一个子文件夹名称只输出一次(避免多个符合条件的文件导致重复输出)
内容的提问来源于stack exchange,提问作者Pankaj
相关产品推荐
相关产品推荐

