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

culter
la source
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
Goyuix
la source
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
Straff
la source
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
CB.
la source
9
PS C:\Users\joshua> $file = New-Object System.IO.FileInfo('file.type')
PS C:\Users\joshua> $file.BaseName, $file.Extension
file
.type
Jaqueline Vanek
la source
8

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

Shay Levy
la source
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];
Ernest Correale
la source
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
Esperento57
la source
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                                                                                                             
hans57sauc
la source
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.

Jacob Degeling
la source