web-dev-qa-db-ja.com

PowerShellのファイル名からパスと拡張子を削除する

ファイルへのフルパスである一連の文字列があります。ファイル拡張子と先頭のパスなしで、ファイル名だけを保存したいです。だからこれから:

c:\temp\myfile.txt

myfile

実際にディレクトリを反復処理するわけではありません。その場合、powershellのbasenameプロパティのようなものを使用できますが、文字列だけを扱っています。

82
larryq

そのための便利な.NETメソッドがあります。

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

フルパス、ディレクトリ、ファイル名、またはファイル拡張子を表示する問題に対処するために考えていたよりもずっと簡単です。

$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

他の形式:

$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

answer @ walid2miに触発された:

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

注意:これは、指定されたファイルが実際に存在する場合にのみ機能します

35
CodeFox

または

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

または

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

basename propertyを使用できます

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

@ Keith

ここで別のオプション:

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

任意のパス文字列が与えられると、System.IO.Pathオブジェクトのさまざまな静的メソッドは以下の結果をもたらします。

 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 = PathString .ps1 
 GetExtension = .ps1 
 GetFileNameWithoutExtension = PathStringInfo 

上記の出力を生成したコードは次のとおりです。

[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 ) );

上記を生成したスクリプトを記述してテストすると、PowerShellがC#、C、C++、Windows NTコマンドスクリプト言語とどのように異なるか、そして私が経験した他のすべてについてのいくつかの奇妙なことが明らかになりました。

2
David A. Gray

これは括弧なしのものです

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

これは、文字列を数回分割することで実行できます。

#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

コメントなしのコードは次のとおりです。

$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