web-dev-qa-db-fra.com

Supprimer le chemin et l'extension du nom de fichier dans powershell

J'ai une série de chaînes qui sont des chemins complets vers les fichiers. Je voudrais enregistrer uniquement le nom de fichier, sans l'extension de fichier et le chemin d'accès principal. Donc de ceci:

c:\temp\myfile.txt

à

myfile

Je ne suis pas en train de parcourir un répertoire. Dans ce cas, vous pouvez utiliser la propriété basename de powershell, mais je ne traite que des chaînes.

82
larryq

Il existe une méthode .NET pratique pour cela:

C:\PS> [io.path]::GetFileNameWithoutExtension("c:\temp\myfile.txt")
myfile
94
Keith Hill

Bien plus facile que je ne le pensais pour résoudre le problème de l'affichage du chemin complet, du répertoire, du nom du fichier ou de son extension.

$PSCommandPath
(Get-Item $PSCommandPath ).Extension
(Get-Item $PSCommandPath ).Basename
(Get-Item $PSCommandPath ).Name
(Get-Item $PSCommandPath ).DirectoryName
(Get-Item $PSCommandPath ).FullName
$ConfigINI = (Get-Item $PSCommandPath ).DirectoryName+"\"+(Get-Item $PSCommandPath ).BaseName+".ini"
$ConfigINI

autres formes:

$scriptPath = split-path -parent $MyInvocationMyCommand.Definition
split-path -parent $PSCommandPath
Split-Path $script:MyInvocation.MyCommand.Path
split-path -parent $MyInvocation.MyCommand.Definition
[io.path]::GetFileNameWithoutExtension($MyInvocation.MyCommand.Name)
65
Leonardo

Inspiré par un réponse de @ walid2mi:

(Get-Item 'c:\temp\myfile.txt').Basename

Remarque: cela ne fonctionne que si le fichier donné existe vraiment.

35
CodeFox

ou

([io.fileinfo]"c:\temp\myfile.txt").basename

ou

"c:\temp\myfile.txt".split('\.')[-2]
27
walid2mi

vous pouvez utiliser la propriété nom_base

PS II> ls *.ps1 | select basename
21
walid2mi

@ Keith ,

ici une autre option:

PS II> $f="C:\Downloads\ReSharperSetup.7.0.97.60.msi"

PS II> $f.split('\')[-1] -replace '\.\w+$'

PS II> $f.Substring(0,$f.LastIndexOf('.')).split('\')[-1]
5
walid2mi

Quelles que soient les chaînes de chemins arbitraires, différentes méthodes statiques sur l'objet System.IO.Path donnent les résultats suivants.

 strTestPath = C:\Utilisateurs\DAG\Documents\Articles_2018\NTFS_File_Times_in_CMD\PathStringInfo.ps1 
 GetDirectoryName = C:\Utilisateurs\DAG\Documents\Articles_2018\NTFS_File_Times_in_CMD [.____. .ps1 
 GetExtension = .ps1 
 GetFileNameWithoutExtension = PathStringInfo 

Voici le code qui a généré la sortie ci-dessus.

[console]::Writeline( "strTestPath                 = {0}{1}" ,
                      $strTestPath , [Environment]::NewLine );
[console]::Writeline( "GetDirectoryName            = {0}" ,
                      [IO.Path]::GetDirectoryName( $strTestPath ) );
[console]::Writeline( "GetFileName                 = {0}" ,
                      [IO.Path]::GetFileName( $strTestPath ) );
[console]::Writeline( "GetExtension                = {0}" ,
                      [IO.Path]::GetExtension( $strTestPath ) );
[console]::Writeline( "GetFileNameWithoutExtension = {0}" ,
                      [IO.Path]::GetFileNameWithoutExtension( $strTestPath ) );

Écrire et tester le script qui a généré ce qui précède a permis de découvrir certaines particularités de PowerShell par rapport aux langages C #, C, C++, le langage de script de commande Windows NT et à peu près tout ce avec quoi j'ai une expérience quelconque.

2
David A. Gray

En voici une sans parenthèses

[io.fileinfo] 'c:\temp\myfile.txt' | % basename
1
Steven Penny

Cela peut être fait en scindant la chaîne plusieurs fois.

#Path
$Link = "http://some.url/some/path/file.name"

#Split path on "/"
#Results of split will look like this : 
# http:
#
# some.url
# some
# path
# file.name
$Split = $Link.Split("/")

#Count how many Split strings there are
#There are 6 strings that have been split in my example
$SplitCount = $Split.Count

#Select the last string
#Result of this selection : 
# file.name
$FilenameWithExtension = $Split[$SplitCount -1]

#Split filename on "."
#Result of this split : 
# file
# name
$FilenameWithExtensionSplit = $FilenameWithExtension.Split(".")

#Select the first half
#Result of this selection : 
# file
$FilenameWithoutExtension = $FilenameWithExtensionSplit[0]

#The filename without extension is in this variable now
# file
$FilenameWithoutExtension

Voici le code sans commentaires:

$Link = "http://some.url/some/path/file.name"
$Split = $Link.Split("/")
$SplitCount = $Split.Count
$FilenameWithExtension = $Split[$SplitCount -1]
$FilenameWithExtensionSplit = $FilenameWithExtension.Split(".")
$FilenameWithoutExtension = $FilenameWithExtensionSplit[0]
$FilenameWithoutExtension
0
Nullldata