我创建了一个小批处理脚本,在给定根文件夹的情况下查看具有顺序名称的所有文件夹并返回最新创建的文件:
@echo off
FOR /F "delims=" %%i IN ('dir C:\RootFolder\FolderName_* /b /ad-h /t:c /o-d') DO (
SET a=%%i
GOTO :found
)
echo No folder found
goto :eof
:found
echo Most recent directory: %a%
现在我必须通过返回包含以下字符串
的最新目录来增强它Name="Test" Value="completed"
在名为test的子文件夹中名为test.xml的文件中。
F.e。我有
然后应该返回的文件夹是3号。
有没有办法实现这个目标?
提前谢谢!
答案 0 :(得分:1)
使用您的模式使用powerShell获取最新创建的目录:
Get-Childitem FolderName_* | sort CreationTimeUTC
进一步扩展它,考虑test.xml:
Dir RootFolder_* |
Sort CreationTimeUtc |
Select -Property FullName, @{Name="XmlFile";Expression={ $_.FullName + "\test.xml"}} |
Where { Test-Path $_.XmlFile } |
Select FullName, @{Name="XmlContent";Expression={ Get-Content ($_.XmlFile)}} |
Where { $_.XmlContent -match "Value=""completed""" } |
Select -ExpandProperty FullName -First 1
您还可以稍微调整一下,以获取包含您的模式的最新xml文件:
Dir RootFolder_*\test.xml |
Where { Test-Path $_.FullName } |
Select FullName, @{Name="XmlContent";Expression={ Get-Content ($_.FullName)}} |
Where { $_.XmlContent -match "Value=""completed""" } |
Select -First 1
答案 1 :(得分:1)
我认为我宁愿使用通配符和Select-String
cmdlet在PowerShell中执行此操作。为了便于阅读,我会在管道之后进行换行和缩进,因为这会很长。
Get-ChildItem 'C:\RootFolder\FolderName_*\Test\Test.xml' |
Where{(Select-String -simplematch 'Name="Test" Value="completed"' -quiet)} |
Select -Expand Parent |
Select -Expand Parent |
Sort -Descending LastWriteTime |
Select -First 1
所以让我们逐行打破这个:
Where
语句,使用Select-String
开关使用-Quiet
搜索这些文件中的字符串'Name =“Test”Value =“completed”'{{1}只输出True / False,具体取决于它是否在文件中找到了字符串。因此Select-String
语句只传递包含字符串的文件。 Where
属性,为我们提供存储每个文件的'Test'文件夹。就是这样,它可以为您提供您正在寻找的文件夹对象(移动它,重命名,只显示它,等等)。