powershell: estrae il nome e l'estensione del file


114

Ho bisogno di estrarre il nome del file e l'estensione da, ad esempio, my.file.xlsx. Non conosco il nome del file o dell'estensione e potrebbero esserci più punti nel nome, quindi devo cercare la stringa da destra e quando trovo il primo punto (o l'ultimo da sinistra), estraggo la parte sul lato destro e la parte sul lato sinistro da quel punto.

Forse c'è una soluzione migliore, ma non ho trovato niente qui o altrove. Grazie


estrarre da un file di testo o da cosa?
CB.

Ciao Christian, ho aggiornato la mia domanda. Devo estrarlo dal nome del file. Grazie
culter

Risposte:


174

Se il file esce dal disco e come altri hanno affermato, utilizzare le proprietà BaseNamee Extension:

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

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

Se ti viene dato il nome del file come parte di una stringa (diciamo proveniente da un file di testo), utilizzerei i metodi GetFileNameWithoutExtensione GetExtensionstatici della 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

8
Per metodi più utili nella classe System.IO.Path senza fare riferimento alla documentazione di MSDN, è possibile utilizzare[System.IO.Path] | Get-Member -Static
Phil

2
Nota che [System.IO.Path]::GetExtensionrestituisce l'estensione includendo il punto (".") .
Ohad Schneider

Grazie @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

Se proviene da un file di testo e presumendo che il file del nome sia circondato da spazi bianchi, questo è un modo:

$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('.'))) }

Se è un file puoi usare qualcosa di simile in base alle tue esigenze:

$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

Verificare le proprietà BaseName ed Extension dell'oggetto FileInfo.


1
Qualche informazione particolare che stai cercando? Basta inviare un file a Get-Member per rivelare tutti i membri o passare a MSDN per trovare l'aiuto ufficiale.
Shay Levy

7

Usa 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
Nota che questo funzionerà solo se non ci sono punti nel nome del file.
Halfdone

2
puoi cambiare in Split(".")[-1]per farlo funzionare con i file con punti nel nome
phuclv

6

fallo e basta:

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

1
Penso che dovrebbe essere$file.Basename
john v kumpf

0

Questo è un adattamento, se qualcuno è curioso. Avevo bisogno di verificare se RoboCopy ha copiato con successo un file su più server per la sua integrità:

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

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

Bello e semplice, e mostra la directory e il file al suo interno. Se si desidera specificare un nome di file o un'estensione, è sufficiente sostituire gli * con quello che si desidera.

    Directory: \\SERVER\Folder\Share

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

0

A partire da PowerShell 6.0, Split-Pathha un -Extenstionparametro. Ciò significa che puoi fare:

$path | Split-Path -Extension

o

Split-Path -Path $path -Extension

Per $path = "test.txt"entrambe le versioni tornerà .txt, compreso il punto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.