Powershell Get-ChildItem most recent file in directory - powershell

We produce files with date in the name.
(* below is the wildcard for the date)
I want to grab the last file and the folder that contains the file also has a date(month only) in its title.
I am using PowerShell and I am scheduling it to run each day. Here is the script so far:
$LastFile = *_DailyFile
$compareDate = (Get-Date).AddDays(-1)
$LastFileCaptured = Get-ChildItem -Recurse | Where-Object {$LastFile.LastWriteTime
-ge $compareDate}

If you want the latest file in the directory and you are using only the LastWriteTime to determine the latest file, you can do something like below:
gci path | sort LastWriteTime | select -last 1
On the other hand, if you want to only rely on the names that have the dates in them, you should be able to something similar
gci path | select -last 1
Also, if there are directories in the directory, you might want to add a ?{-not $_.PsIsContainer}

Yes I think this would be quicker.
Get-ChildItem $folder | Sort-Object -Descending -Property LastWriteTime -Top 1

Try:
$latest = (Get-ChildItem -Attributes !Directory | Sort-Object -Descending -Property LastWriteTime | select -First 1)
$latest_filename = $latest.Name
Explanation:
PS C:\Temp> Get-ChildItem -Attributes !Directory *.txt | Sort-Object -Descending -Property LastWriteTime | select -First 1
Directory: C:\Temp
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 5/7/2021 5:51 PM 1802 Prison_Mike_autobiography.txt
Get-ChildItem -Attributes !Directory *.txt or Get-ChildItem or gci : Gets list of files ONLY in current directory. We can give a file extension filter too as needed like *.txt. Reference: gci, Get-ChildItem
Sort-Object -Descending -Property LastWriteTime : Sort files by LastWriteTime (modified time) in descending order. Reference
select -First 1 : Gets the first/top record. Reference Select-Object / select
Getting file metadata
PS C:\Temp> $latest.Name
Prison_Mike_autobiography.txt
PS C:\Temp> $latest.DirectoryName
C:\Temp
PS C:\Temp> $latest.FullName
C:\Temp\Prison_Mike_autobiography.txt
PS C:\Temp> $latest.CreationTime
Friday, May 7, 2021 5:51:19 PM
PS C:\Temp> $latest.Mode
-a----

#manojlds's answer is probably the best for the scenario where you are only interested in files within a root directory:
\path
\file1
\file2
\file3
However, if the files you are interested are part of a tree of files and directories, such as:
\path
\file1
\file2
\dir1
\file3
\dir2
\file4
To find, recursively, the list of the 10 most recently modified files in Windows, you can run:
PS > $Path = pwd # your root directory
PS > $ChildItems = Get-ChildItem $Path -Recurse -File
PS > $ChildItems | Sort-Object LastWriteTime -Descending | Select-Object -First 10 FullName, LastWriteTime

You could try to sort descending "sort LastWriteTime -Descending" and then "select -first 1." Not sure which one is faster

Related

How to get last modified folder name in powershell?

I want to get the name of the last modified folder. I have tried the below command but it is not giving me the correct folder name.
(Get-ChildItem c:\ -Directory).Name | Sort-object -Property lastWriteTime -Descending | Select -First 1
Don't select the name in Get-ChildItem, but in the later select, and use -First because you are already sorting it descending:
Get-ChildItem c:\ -Directory | Sort-object -Property lastWriteTime -Descending | select name -first 1
(Get-ChildItem -Path C:\example -Directory | Sort-Object LastWriteTime | Select-Object -Last 1).Name
Get-ChildItem -Path C:\example -Directory: gets a list of all the subfolders in the "C:\example" directory.
Sort-Object LastWriteTime: sorts the folders by their last modified date.
Select-Object -Last 1: selects the last folder in the sorted list.
.Name: displays the name of the selected folder.

Search for specific folder name in filtered path

I need to search for a specific folder name from filtered path.
For example:
I have some folders like on disk m:
M:\
├───2.46.567
│ └───A
├───3.09.356
│ └───A
├───4.05.123
│ └───A
└───4.05.124
└───B
I want to search folder A only from 4.05.xxx dir. And also i want to check is this folder is last one contains folder A.
I try something like the following command:
Get-ChildItem -Path m:\* -recurse -filter '*4.05*' | sort -descending LastWriteTime
Can I do this in PowerShell?
Get-ChildItem allows wildcards on several levels in a path not just the last - no recurse needed.
Get-ChildItem 'M:\4.05.*\A' -Directory | Sort-Object -Descending LastWriteTime
In the above tree this returns just one entry:
Directory: M:\4.05.123
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2019-08-30 12:10 A
An alternative with the same result based on above tree:
Get-ChildItem -Path 'M:\4.05.*' -Filter A -Recurse -Directory | Sort-Object -Descending LastWriteTime
PowerShell Version 2 variant
Get-ChildItem 'M:\4.05.*\A' | Where-Object {$_.PSIsContainer} |
Sort-Object -Desc LastWriteTime | Select-Object -First 1 | Set-Location
Try this:
param(
$SourceDir = "M:\"
)
$a = gci $SourceDir | foreach { $i = gci $sourcedir\$_ -Name ; if($i.equals("A")) {"$_"} }
for($h=0;$h -le $a.Length-1; $h++ ) {
if($a[$h] -like "4.05.*") {
$a[$h]
if( $a[$h].equals($a[$a.length-1])) {
"It is the last one."
}}}
This will return all folders that contain a folder "A" and have "4.05." as part of its name. It will also return whether or not it is the last folder in the array, therefore also the last folder that contains "A".
You can also use Resolve-Path.
(Resolve-Path "M:\4.05.*\A").ProviderPath
This returns the string (not the folder object!) of the paths you're after.

Column Directory empty?

I thought that applying this answer about replacing a path would work for:
$folder = 'C:\test'
$List = Get-ChildItem $folder -Recurse | Sort-Object -Property LastWriteTime
$List | Format-Table name, LastWriteTime, #{Label="Directory"; Expression={$_.Directory.Replace($folder, "")}}
Instead I get nothing in Directory column whereas I should get
\subfolder\
since the files are in
c:\test\subfolder
Name LastWriteTime Directory
---- ------------- ---------
test.1.png 7/21/2018 10:20:44 PM
test.2.png 7/21/2018 10:21:16 PM
test.3.png 7/21/2018 10:21:43 PM
subfolder 9/10/2018 6:53:28 PM
The Directory member of Get-ChildItem is a System.IO.DirectoryInfo. It has a member, Name, that can be used.
PS H:\clan\2018-09-05> (Get-ChildItem).Directory | Get-Member
TypeName: System.IO.DirectoryInfo
Try using:
Get-ChildItem | ForEach-Object { $_.Directory.Name }

PowerShell CSV Compare files with dynamic file names [duplicate]

We produce files with date in the name.
(* below is the wildcard for the date)
I want to grab the last file and the folder that contains the file also has a date(month only) in its title.
I am using PowerShell and I am scheduling it to run each day. Here is the script so far:
$LastFile = *_DailyFile
$compareDate = (Get-Date).AddDays(-1)
$LastFileCaptured = Get-ChildItem -Recurse | Where-Object {$LastFile.LastWriteTime
-ge $compareDate}
If you want the latest file in the directory and you are using only the LastWriteTime to determine the latest file, you can do something like below:
gci path | sort LastWriteTime | select -last 1
On the other hand, if you want to only rely on the names that have the dates in them, you should be able to something similar
gci path | select -last 1
Also, if there are directories in the directory, you might want to add a ?{-not $_.PsIsContainer}
Yes I think this would be quicker.
Get-ChildItem $folder | Sort-Object -Descending -Property LastWriteTime -Top 1
Try:
$latest = (Get-ChildItem -Attributes !Directory | Sort-Object -Descending -Property LastWriteTime | select -First 1)
$latest_filename = $latest.Name
Explanation:
PS C:\Temp> Get-ChildItem -Attributes !Directory *.txt | Sort-Object -Descending -Property LastWriteTime | select -First 1
Directory: C:\Temp
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 5/7/2021 5:51 PM 1802 Prison_Mike_autobiography.txt
Get-ChildItem -Attributes !Directory *.txt or Get-ChildItem or gci : Gets list of files ONLY in current directory. We can give a file extension filter too as needed like *.txt. Reference: gci, Get-ChildItem
Sort-Object -Descending -Property LastWriteTime : Sort files by LastWriteTime (modified time) in descending order. Reference
select -First 1 : Gets the first/top record. Reference Select-Object / select
Getting file metadata
PS C:\Temp> $latest.Name
Prison_Mike_autobiography.txt
PS C:\Temp> $latest.DirectoryName
C:\Temp
PS C:\Temp> $latest.FullName
C:\Temp\Prison_Mike_autobiography.txt
PS C:\Temp> $latest.CreationTime
Friday, May 7, 2021 5:51:19 PM
PS C:\Temp> $latest.Mode
-a----
#manojlds's answer is probably the best for the scenario where you are only interested in files within a root directory:
\path
\file1
\file2
\file3
However, if the files you are interested are part of a tree of files and directories, such as:
\path
\file1
\file2
\dir1
\file3
\dir2
\file4
To find, recursively, the list of the 10 most recently modified files in Windows, you can run:
PS > $Path = pwd # your root directory
PS > $ChildItems = Get-ChildItem $Path -Recurse -File
PS > $ChildItems | Sort-Object LastWriteTime -Descending | Select-Object -First 10 FullName, LastWriteTime
You could try to sort descending "sort LastWriteTime -Descending" and then "select -first 1." Not sure which one is faster

How to get the directory location for file recently modified

Suppose we have two directories C:\username\test1 & C:\username\test2. Both directories contain same file script.ps1. Now with powershell script I want to search the file script.ps1 in both directories & want the complete file location of file which is latest modified/created.
I was using below command but it did not give the desired output
Get-ChildItem -Path "C:\username" script.ps1 -Recurse | Where-object {!$_.psIsContainer -eq $true} | ForEach-Object -Process {$_.FullName} | select -last 1
For a given directory you can use
Get-ChildItem C:\dir1\dir2 -Recurse -ErrorAction SilentlyContinue | Where {!$_.PsIsContainer}|select Name,DirctoryName, LastWriteTime |Sort LastWriteTime -descending | select -first 1   Name DirctoryName LastWriteTime
And if you want it to run for multiple directories, you will have to run a loop on each directory:
Get-ChildItem C:\dir\* | Where {$_.PsIsContainer} | foreach-object { Get-ChildItem $_ -Recurse -ErrorAction Sile   ntlyContinue | Where {!$_.PsIsContainer} | Select Name,DirectoryName, LastWriteTime, Mode | Sort LastWriteTime -descend   ing | select -first 1}
It will list files which are last modified for each directories.
Edit: Search for a file
You can use following command to search for a file recursively if it is there in multiple directories:
Get-ChildItem -Path C:\Myfolder -Filter file.whatever -Recurse -ErrorAction SilentlyContinue -Force
This will list all versions of the file found, from newest to oldest:
Get-ChildItem -Path "C:\UserName" `
-File `
-Recurse `
-Include "Script.ps1" |
Sort-Object LastWriteTime -Descending |
Format-Table LastWriteTime, FullName -AutoSize
If you only want the most recent one, then replace the Format-Table line with:
Select-Object -First 1