批处理脚本在文本文件中返回最近的文件夹名称和字符串匹配

时间:2015-05-14 21:06:54

标签: xml string powershell batch-file command-prompt

我创建了一个小批处理脚本,在给定根文件夹的情况下查看具有顺序名称的所有文件夹并返回最新创建的文件:

@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。我有

  1. C:\ RootFolder \ FolderName_1 \ ---今天创建---使用test \ test.xml但不包含该字符串
  2. C:\ RootFolder \ FolderName_2 \ ---昨天创建---但没找到test \ test.xml
  3. C:\ RootFolder \ FolderName_3 \ ---三天前使用test \ test.xml和
  4. 中的匹配字符串创建
  5. C:\ RootFolder \ FolderName_4 \ ---四天前用test \ test.xml和
  6. 中的匹配字符串创建

    然后应该返回的文件夹是3号。

    有没有办法实现这个目标?

    提前谢谢!

2 个答案:

答案 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

所以让我们逐行打破这个:

  1. Get-ChildItem获取存储在文件夹“test”子文件夹中的所有Test.xml文件的文件对象。
  2. 然后输入Where语句,使用Select-String开关使用-Quiet搜索这些文件中的字符串'Name =“Test”Value =“completed”'{{1}只输出True / False,具体取决于它是否在文件中找到了字符串。因此Select-String语句只传递包含字符串的文件。
  3. 接下来,我们展开Where属性,为我们提供存储每个文件的'Test'文件夹。
  4. 然后我们再次执行此操作,向我们提供存储'Test'文件夹的'FolderName_ *'文件夹。
  5. 然后我们按LastWriteTime排序。
  6. 最后我们选择第一个。
  7. 就是这样,它可以为您提供您正在寻找的文件夹对象(移动它,重命名,只显示它,等等)。