141 votes

Powershell - extraire le nom de fichier et l'extension

Je dois extraire le nom du fichier et l'extension à partir de par exemple mon.fichier.xlsx. Je ne connais pas le nom du fichier ou l'extension et il peut y avoir plus de points dans le nom, donc je dois chercher la chaîne à partir de la droite et quand je trouve le premier point (ou le dernier à partir de la gauche), extraire la partie du côté droit et la partie du côté gauche de ce point.

Comment faire?

207voto

Goyuix Points 9634

Si le fichier provient du disque comme indiqué par d'autres, utilisez les propriétés BaseName et Extension :

PS C:\> dir *.xlsx | select BaseName,Extension

BaseName                                Extension
--------                                ---------
StackOverflow.com Test Config           .xlsx  

Si le nom du fichier est donné comme partie d'une chaîne de caractères (par exemple à partir d'un fichier texte), je recommande d'utiliser les méthodes statiques GetFileNameWithoutExtension et GetExtension de la classe System.IO.Path :

PS C:\> [System.IO.Path]::GetFileNameWithoutExtension("Test Config.xlsx")
Test Config
PS H:\> [System.IO.Path]::GetExtension("Test Config.xlsx")
.xlsx

11 votes

Pour plus de méthodes utiles dans la classe System.IO.Path sans se référer à la documentation MSDN, vous pouvez utiliser [System.IO.Path] | Get-Member -Static

5 votes

Notez que [System.IO.Path]::GetExtension renvoie l'extension incluant le point (".").

33voto

Esperento57 Points 8045

Il suffit de le faire:

$file = Get-Item "C:\temp\file.htm"
$file.Basename 
$file.Extension

2 votes

Je pense que cela devrait être $file.Basename

5 votes

Voici la réponse idéale si le fichier existe, sinon vous obtiendrez une exception ObjectNotFound.

23voto

Straff Points 1105

split-path a un drapeau -leaf, qui extraira le nom de fichier et l'extension d'un chemin donné.

PS C:\Windows\System32\WindowsPowerShell\v1.0> split-path "H:\Documents\devops\tp-mkt-SPD-38.4.10.msi" -leaf
tp-mkt-SPD-38.4.10.msi

PS C:\Windows\System32\WindowsPowerShell\v1.0> $psversiontable

Name                           Value
----                           -----
CLRVersion                     2.0.50727.5477
BuildVersion                   6.1.7601.17514
PSVersion                      2.0
WSManStackVersion              2.0
PSCompatibleVersions           {1.0, 2.0}
SerializationVersion           1.1.0.1
PSRemotingProtocolVersion      2.1

2 votes

Il s'agit évidemment pas d'une réponse

17voto

Ernest Correale Points 333

Utiliser Split-Path

$cheminFichier = "C:\PS\Test.Documents\monFichierTest.txt";
$nomFichier = (Split-Path -Path $cheminFichier -Leaf).Split(".")[0];
$extension = (Split-Path -Path $cheminFichier -Leaf).Split(".")[1];

6 votes

Notez que cela ne fonctionnera que s'il n'y a pas de points dans le nom de fichier.

6 votes

Vous pouvez changer en Split(".")[-1] pour que cela fonctionne avec des fichiers contenant des points dans le nom

0 votes

@phuclv Cette solution renvoie l'extension des fichiers au format typique nom.extension .

14voto

CB. Points 24549

Si c'est à partir d'un fichier texte et en supposant que les noms de fichiers sont entourés par des espaces blancs, voici une façon de faire :

$a = get-content c:\myfile.txt

$b = $a | select-string -pattern "\s.+\..{3,4}\s" | select -ExpandProperty matches | select -ExpandProperty value

$b | % {"Nom du fichier : {0} - Extension : {1}" -f $_.substring(0, $_.lastindexof('.')) , $_.substring($_.lastindexof('.'), ($_.length - $_.lastindexof('.'))) }

Si c'est un fichier, vous pouvez utiliser quelque chose comme ceci en fonction de vos besoins :

$a = dir .\my.file.xlsx # ou $a = get-item c:\my.file.xlsx 

$a
    Répertoire : Microsoft.PowerShell.Core\FileSystem::C:\ps

Mode           Dernière écriture       Longueur Nom
----           -------------       ------ ----
-a---      25/01/10    11.51          624 my.file.xlsx

$a.BaseName
my.file
$a.Extension
.xlsx

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X