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.
Il existe une méthode .NET pratique pour cela:
C:\PS> [io.path]::GetFileNameWithoutExtension("c:\temp\myfile.txt")
myfile
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)
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.
ou
([io.fileinfo]"c:\temp\myfile.txt").basename
ou
"c:\temp\myfile.txt".split('\.')[-2]
vous pouvez utiliser la propriété nom_base
PS II> ls *.ps1 | select basename
@ 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]
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.
En voici une sans parenthèses
[io.fileinfo] 'c:\temp\myfile.txt' | % basename
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