Home > Blockchain >  Retrieving file information of specific date using powershell
Retrieving file information of specific date using powershell

Time:04-30

I have a base folder as:

D:\St\Retail\AMS\AMS\FTP-FromClient\AMS

It contains various folders of dates:

2022-04-01
2022-04-02
...
...

2022-02-02
2021-05-05
2019-04-12

And each of these folders contains own files inside the folder. So, I want to retrieve all the filename inside the folder if it has 2022-04. So if the folder has '2022-04' as the base name ,I need to retreive all the file inside the folder like '2022-04-01','2022-04-02','2022-04-03'. The way I tried is:

cls
$folerPath = 'D:\St\Retail\AMS\AMS\FTP-FromClient\AMS'
$files = Get-ChildItem $folerPath
[System.Collections.ArrayList]$data = @()
foreach ($f in $files) {
    $a = Get-ChildItem $f.FullName
    foreach ($inner in $a) {
        echo $inner.FullName
        $outfile = $inner.FullName -match '*2022-04*'
        $datepart = $inner.FullName.split('\')[-1]
        if ($outfile) {
            $data.add($datepart   '\'   $inner.Name.Trim())
        }
    }
}

My final $data may contains like this:

2022-04-01/abc.txt
2022-04-02/cde.pdf
2022-04-03/e.xls

CodePudding user response:

You can do this by first collecting the directories you want to explore and then loop over these to get the files inside.

Using a calculated property you can output in whatever format you like:

$folderPath = 'D:\St\Retail\AMS\AMS\FTP-FromClient\AMS'

$data = Get-ChildItem -Path $folderPath -Filter '2022-04*' -Directory | ForEach-Object {
    $dir = $_.Name
    (Get-ChildItem -Path $_.FullName -File | 
     Select-Object @{Name = 'FolderFile'; Expression = {'{0}\{1}' -f $dir, $_.Name}}).FolderFile
}

After this, $data would be a string array with this content:

2022-04-01\abc.txt
2022-04-02\cde.pdf
2022-04-03\e.xls

CodePudding user response:

By using wildcards for both directory and file name, you only need a single Get-ChildItem call:

$folderPath = 'D:\St\Retail\AMS\AMS\FTP-FromClient\AMS'
$folderDate = '2022-04'

[array] $data = Get-ChildItem "$folderPath/$folderDate*/*" -File | ForEach-Object{ 
    # Join-Path's implicit output will be captured as an array in $data.
    Join-Path $_.Directory.Name $_.Name 
}

$data will be an array of file paths like this:

2022-04-01\abc.txt
2022-04-02\cde.pdf
2022-04-03\e.xls

Notes:

  • [array] $data makes sure that the variable always contains an array. Otherwise PowerShell would output a single string value when only a single file is found. This could cause problems, e. g. when you want to iterate over $data by index, you would iterate over the characters of the single string instead.
  • To make this answer platform-independent I'm using forward slashes in the Get-ChildItem call which work as path separators under both Windows and *nix platforms.
  • Join-Path is used to make sure the output paths use the expected default path separator (either / or \) of the platform.
  • Related