2012-06-26 15 views
31

Si, por ejemplo, que tiene un directorio que contiene los archivos siguientes:¿Cómo encontrar el archivo más nuevo en el directorio usando el script de PowerShell?

Test-20120626-1023.txt 
Test-20120626-0710.txt 
Test-20120626-2202.txt 
Test-20120626-1915.txt 
Test-20120626-1142.txt 

Como se puede ver, cada nombre de archivo contiene momento de la creación que está en formato ordenable. Mi pregunta es cómo encontrar el nombre del último nombre de archivo (en este caso Test-20120626-2202.txt) y almacenarlo en una variable?

Nota: La ruta del directorio también se almacena en la variable si hace alguna diferencia.

Respuesta

54

Usted podría intentar algo como esto:

$dir = "C:\test_code" 
$latest = Get-ChildItem -Path $dir | Sort-Object LastAccessTime -Descending | Select-Object -First 1 
$latest.name 
+1

Y si desea buscar un archivo específico, cambio de $ dir a "C: \. Test_code \ somefile *" –

+0

y si desea buscar todos los subdirectorios 'Get-ChildItem -Recurse -Path $ dir' etc. También tenga en cuenta que el primer parámetro en Select-Object selecciona k superior. –

8

si el nombre es el momento de la creación equivalente de la propiedad del archivo CreationTime puede utilizar simplemente:

$a = Dir | Sort CreationTime -Descending | Select Name -First 1 

continuación

$a.name 

contiene el nombre del archivo.

creo que funciona también si este nombre tiene siempre mismo formato (Fecha Hora & con el acolchado de 0: ex 20120102 a 0001):

$a = Dir | Sort Name -Descending | Select Name -First 1 
4

Si, por algún motivo, la fecha de creación de los archivos es diferente a la que figura en el nombre del archivo, puede analizar el nombre del archivo en un objeto datetime y ordenar por expresión:

$file = Get-ChildItem | 
Sort-Object { [DateTime]::ParseExact($_.BaseName,'\Te\s\t\-yyyyMMdd\-HHmm',$null) } | 
Select-Object -Last 1 
5

Si está trabajando con una gran cantidad de archivos, le sugiero que use el parámetro -Filter ya que el tiempo de ejecución se verá muy reducido.

Según el ejemplo provisto por James, aquí se explica cómo se usaría;

$dir = "C:\test_code" 
 
$filter="*.txt" 
 
$latest = Get-ChildItem -Path $dir -Filter $filter | Sort-Object LastAccessTime -Descending | Select-Object -First 1 
 
$latest.name

Cuestiones relacionadas