PowerShell - extrait le nom et l'extension du fichier


114

J'ai besoin d'extraire le nom de fichier et l'extension de par exemple my.file.xlsx. Je ne connais pas le nom du fichier ou de l'extension et il peut y avoir plus de points dans le nom, donc j'ai besoin de rechercher la chaîne de droite et quand je trouve le premier point (ou le dernier à partir de la gauche), extrayez la partie sur le côté droit et la partie sur le côté gauche de ce point.

Il y a peut-être une meilleure solution, mais je n'ai rien trouvé ici ni ailleurs. Je vous remercie


extraire d'un fichier texte ou de quoi?
CB.

Salut Christian, j'ai mis à jour ma question. J'ai besoin de l'extraire du nom du fichier. Merci
culter

Réponses:


174

Si le fichier sort du disque et comme d'autres l'ont indiqué, utilisez les propriétés BaseNameet Extension:

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

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

Si vous recevez le nom du fichier dans le cadre d'une chaîne (par exemple, provenant d'un fichier texte), j'utiliserais les méthodes GetFileNameWithoutExtensionet GetExtensionstatic 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

9
Pour des méthodes plus utiles dans la classe System.IO.Path sans faire référence à la documentation MSDN, vous pouvez utiliser[System.IO.Path] | Get-Member -Static
Phil

2
Notez que [System.IO.Path]::GetExtensionrenvoie l'extension incluant le point (".") .
Ohad Schneider

Merci @OhadSchneider
m1m1k

24
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

13

Si provient d'un fichier texte et que le fichier de nom présumé est entouré d'espaces blancs, c'est un moyen:

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

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

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

S'il s'agit d'un fichier, vous pouvez utiliser quelque chose comme celui-ci en fonction de vos besoins:

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

$a
    Directory: Microsoft.PowerShell.Core\FileSystem::C:\ps


Mode           LastWriteTime       Length Name
----           -------------       ------ ----
-a---      25/01/10    11.51          624 my.file.xlsx


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

9
PS C:\Users\joshua> $file = New-Object System.IO.FileInfo('file.type')
PS C:\Users\joshua> $file.BaseName, $file.Extension
file
.type

8

Vérifiez les propriétés BaseName et Extension de l'objet FileInfo.


1
Des informations particulières que vous recherchez? Il vous suffit de diriger un fichier vers Get-Member pour tout révéler aux membres ou de naviguer vers MSDN pour trouver l'aide officielle.
Shay Levy

7

Utiliser Split-Path

$filePath = "C:\PS\Test.Documents\myTestFile.txt";
$fileName = (Split-Path -Path $filePath -Leaf).Split(".")[0];
$extension = (Split-Path -Path $filePath -Leaf).Split(".")[1];

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

2
vous pouvez changer pour Split(".")[-1]le faire fonctionner avec des fichiers avec des points dans le nom
phuclv

6

simplement fais-le:

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

1
Je pense que ça devrait être$file.Basename
John v Kumpf

0

Ceci est une adaptation, si quelqu'un est curieux. J'avais besoin de tester si RoboCopy avait copié avec succès un fichier sur plusieurs serveurs pour son intégrité:

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

ForEach ($PC in $Comp) {
    dir "\\$PC\Folder\Share\*.*" | Select-Object $_.BaseName
}

Nice et simple, et il montre le répertoire et le fichier à l'intérieur. Si vous souhaitez spécifier un nom de fichier ou une extension, remplacez simplement les * par ce que vous voulez.

    Directory: \\SERVER\Folder\Share

Mode                LastWriteTime     Length Name                                                                                                                                             
----                -------------     ------ ----                                                                                                                                             
-a---         2/27/2015   5:33 PM    1458935 Test.pptx                                                                                                             

0

À partir de PowerShell 6.0, Split-Patha un -Extenstionparamètre. Cela signifie que vous pouvez faire:

$path | Split-Path -Extension

ou

Split-Path -Path $path -Extension

Pour les $path = "test.txt"deux versions reviendra .txt, y compris le point.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.