137

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

c:\temp\myfile.txt

myfile

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

4

14 に答える 14

137

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

C:\PS> [io.path]::GetFileNameWithoutExtension("c:\temp\myfile.txt")
myfile
于 2012-09-19T22:43:32.187 に答える
68

@ walid2miの回答に触発されました:

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

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

于 2014-08-12T09:44:21.527 に答える
32

また

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

また

"c:\temp\myfile.txt".split('\.')[-2]
于 2012-09-20T12:36:35.267 に答える
28

basenameプロパティを使用できます

PS II> ls *.ps1 | select basename
于 2012-09-20T04:57:39.997 に答える
7

@キース

ここで別のオプション:

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]
于 2012-09-20T18:13:02.443 に答える
6

René Nyffenegger の回答を拡張して、PowerShell バージョン 6.x にアクセスできない人のために、ファイルの存在をテストしない分割パスを使用します。

Split-Path "C:\Folder\SubFolder\myfile.txt" -Leaf

これは " myfile.txt " を返します。ファイル名にピリオドが含まれていないことがわかっている場合は、文字列を分割して最初の部分を取得できます。

(Split-Path "C:\Folder\SubFolder\myfile.txt" -Leaf).Split('.') | Select -First 1

また

(Split-Path "C:\Folder\SubFolder\myfile.txt" -Leaf).Split('.')[0]

これは " myfile " を返します。ファイル名にピリオドが含まれる可能性がある場合は、安全のために、次のように使用できます。

$FileName = Split-Path "C:\Folder\SubFolder\myfile.txt.config.txt" -Leaf
$Extension = $FileName.Split('.') | Select -Last 1
$FileNameWoExt = $FileName.Substring(0, $FileName.Length - $Extension.Length - 1)

これは " myfile.txt.config " を返します。ここでは、Replace() の代わりに Substring() を使用することを好みます。これは、私の例のように、ピリオドが前にある拡張子も名前の一部になる可能性があるためです。Substring を使用することで、要求どおりに拡張子のないファイル名を返します。

于 2020-04-14T20:46:53.403 に答える
3

ここに括弧なしのものがあります

[io.fileinfo] 'c:\temp\myfile.txt' | % basename
于 2014-10-29T05:14:08.327 に答える