使用powershell抓取目录中的特定文件并迭代它们?

时间:2017-06-12 14:55:10

标签: powershell powershell-v4.0

我有一个如下所示的目录:

20171206PAFile.txt
20171206PBFile.txt
20171206PCFile.txt
20171106PAFile.txt
20171106PBFile.txt
20171006PAFile.txt  
20171006PBFile.txt    

等...

我想获取名称为20171006的文件,然后对这些文件执行某些操作,然后以迭代方式移动到名为20171106的下一组文件,依此类推。

并且在此过程中将日期部分存储在变量中。

$date = 20171106

有办法做到这一点吗?

[string]$FolderName = "C:\Users\Test\Desktop\TestDirectory"   

$Item = Get-ChildItem *.txt -Path $FolderName|Sort CreationTime| select -First 1

$test = $Item.Name.Substring(0,8)

我将把这些文件移出这个目录,因为我处理它们,所以20171006文件将在第一次迭代后消失。然后是20171106文件等等。

4 个答案:

答案 0 :(得分:2)

powerShell方法是按日期对文件进行分组。所以

  • 获取文件
  • 检查有8个前导数字
  • 从前8位
  • 构建计算属性
  • 按新属性排序
  • 按新属性分组
  • 进一步处理取决于您计划的步骤。

编辑:凭借今天的知识和技能,这更容易:

> gci [0-9]*.txt | ? BaseName -match '^(\d{8})' | group {$matches[1]} |ft -auto

Count Name     Group
----- ----     -----
    2 20171006 {20171006PAFile.txt, 20171006PBFile.txt}
    2 20171106 {20171106PAFile.txt, 20171106PBFile.txt}
    3 20171206 {20171206PAFile.txt, 20171206PBFile.txt, 20171206PCFile.txt}
Get-ChildItem *.txt|
  Where-Object {$_.Name -match '^\d{8}'}|
  Select-Object *,@{Name='DT';Expression={$_.Name.Substring(0,8)}}|
  Sort-Object DT|
  Group-Object DT|Format-Table -auto

或者将别名作为一个衬垫相同:

gci *.txt|?{$_.Name -match '^\d{8}'}|select *,@{N='DT';E={$_.Name.Substring(0,8)}}|sort DT|Group DT|ft -auto

示例输出,接下来的步骤可能是迭代组并扩展到文件名。

Count Name     Group
----- ----     -----
    2 20171006 {@{PSPath=Microsoft.PowerShell.Core\FileSystem::X:\Test\20171006PBFile.txt; PSParent...
    2 20171106 {@{PSPath=Microsoft.PowerShell.Core\FileSystem::X:\Test\20171106PAFile.txt; PSParent...
    3 20171206 {@{PSPath=Microsoft.PowerShell.Core\FileSystem::X:\Test\20171206PCFile.txt; PSParent...

答案 1 :(得分:0)

您可以使用以下内容:

dir | findstr "20171106" | Foreach-object { $_ }

干杯,

答案 2 :(得分:0)

试试这个

$FileNames =@("20171106","20171006")
$Path = "C:\"
foreach($FileName in $FileNames){
    $Files = Get-ChildItem -Path $Path -file -Recurse -Include $FileName*
    foreach($File in $Files){
        $File
    }
}

或试试这个

$Files = @("win", "cmd") | foreach-object{ dir "C:\windows\system32" -Recurse -Include "$_*"} | ?{!$_.psiscontainer}
Foreach($File in $Files){
    $File.FullName
}

答案 3 :(得分:0)

Get-ChildItem \folder\to\loop -Recurse -Include *.<filetype> | Foreach-Object{

# stuff to do
}