ファイルへのフルパスである一連の文字列があります。ファイル拡張子と先頭のパスなしで、ファイル名だけを保存したいと思います。だからこれから:
c:\temp\myfile.txt
に
myfile
実際にはディレクトリを反復処理していません。その場合、PowerShell のbasename
プロパティのようなものを使用できますが、文字列だけを扱っています。
ファイルへのフルパスである一連の文字列があります。ファイル拡張子と先頭のパスなしで、ファイル名だけを保存したいと思います。だからこれから:
c:\temp\myfile.txt
に
myfile
実際にはディレクトリを反復処理していません。その場合、PowerShell のbasename
プロパティのようなものを使用できますが、文字列だけを扱っています。
そのための便利な .NET メソッドがあります。
C:\PS> [io.path]::GetFileNameWithoutExtension("c:\temp\myfile.txt")
myfile
また
([io.fileinfo]"c:\temp\myfile.txt").basename
また
"c:\temp\myfile.txt".split('\.')[-2]
basenameプロパティを使用できます
PS II> ls *.ps1 | select basename
@キース、
ここで別のオプション:
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]
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 を使用することで、要求どおりに拡張子のないファイル名を返します。
ここに括弧なしのものがあります
[io.fileinfo] 'c:\temp\myfile.txt' | % basename