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. J'aimerais enregistrer simplement le nom de fichier sans extension de fichier et le chemin principal. Ainsi de ceci:

c:tempmyfile.txt

à

myfile

Je ne suis pas en train d'itérer à travers un répertoire, auquel cas quelque chose comme la propriété basename de powershell pourrait être utilisée, mais plutôt je m'occupe des chaînes seules.

62
demandé sur larryq 2012-09-20 02:39:35

9 réponses

il y a une méthode pratique .NET pour cela:

C:\PS> [io.path]::GetFileNameWithoutExtension("c:\temp\myfile.txt")
myfile
76
répondu Keith Hill 2012-09-19 22:43:32

beaucoup plus facile que je pensais pour aborder la question de l'affichage du chemin complet, répertoire, nom de fichier ou l'extension de fichier.

$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 formulaires:

$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)
45
répondu Leonardo 2015-09-17 15:54:01

ou

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

ou

"c:\temp\myfile.txt".split('\.')[-2]
24
répondu walid2mi 2012-09-20 12:36:35

inspiré par une réponse de @walid2mi:

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

s'il vous Plaît note: cela ne fonctionne que si le fichier existe vraiment .

22
répondu CodeFox 2018-08-18 18:20:32

vous pouvez utiliser basename propriété

PS II> ls *.ps1 | select basename
20
répondu walid2mi 2012-09-20 04:57:39

@Keith ,

voici 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]
4
répondu walid2mi 2018-08-01 18:41:52

En voici un sans parenthèses

[io.fileinfo] 'c:\temp\myfile.txt' | % basename
1
répondu Steven Penny 2018-06-04 13:42:37

étant donné n'importe quelle chaîne de chemin arbitraire, diverses méthodes statiques sur le système.IO.L'objet Path donne les résultats suivants.

strTestPath                 = C:\Users\DAG\Documents\Articles_2018\NTFS_File_Times_in_CMD\PathStringInfo.ps1
GetDirectoryName            = C:\Users\DAG\Documents\Articles_2018\NTFS_File_Times_in_CMD
GetFileName                 = PathStringInfo.ps1
GetExtension                = .ps1
GetFileNameWithoutExtension = PathStringInfo

ci-dessous est 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é le ci-dessus a révélé quelques bizarreries sur la façon dont PowerShell diffère de C#, C, C++, le langage de script de la commande Windows NT, et à peu près tout le reste avec lequel je n'ai aucune expérience.

0
répondu David A. Gray 2018-09-03 12:29:53

cela peut être fait en séparant la chaîne de caractères 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
répondu Nullldata 2018-09-19 14:30:06