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