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


99

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

c:\temp\myfile.txt

myfile

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


6
多くの回答では、質問の2番目の部分は考慮されていません。Get-Item、Get-ChildItem、またはそれらのエイリアスls、dir、gi、gciを使用する場合、テストした文字列のファイルが存在する必要があります一連の文字列をチェックし、ディレクトリを反復処理しない場合、これらのファイルは、このスクリプトが実行されるコンピューターに存在する必要がないと想定する必要があります。
papo 2017

回答:


109

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

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

93

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

$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 $MyInvocation.MyCommand.Definition
split-path -parent $PSCommandPath
Split-Path $script:MyInvocation.MyCommand.Path
split-path -parent $MyInvocation.MyCommand.Definition
[io.path]::GetFileNameWithoutExtension($MyInvocation.MyCommand.Name)

25
上のコードスニペットの各例の横に、どのテキストが返されるかを正確に示していれば、すばらしいでしょう。
deadlydog 2017年

例:私は.csrですファイル名を知らないが、私は、ファイルが存在することがわかっている$csr = Get-ChildItem -Path "$($domain.FullName)/*.csr"、その後Write-Host "fileName: $($csr.Basename)"
スコットPelak

46

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

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

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


1
これは、単一ファイルのファイル名を取得する最も簡単な方法です。
マリスク

5
これは、ファイルが存在することを前提としています。ファイル名から拡張子を削除しても、それに依存すべきではありません。ファイルが存在しないファイル名に基づいてファイルを作成している場合はどうなりますか?パスは文字列であり、文字列として処理する必要があります。既存のファイルとは見なされません。
アントニーブース

29

または

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

または

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

9
2番目の例は、 "C:\ Downloads \ ReSharperSetup.7.0.97.60.msi" .split( '\。')[-2]
Keith Hill

24

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

PS II> ls *.ps1 | select basename

7
OPは言う:私は実際にはディレクトリを反復していません。
CB。

1
私にはとても便利です!
iheartcsharp 2017

5

@キース

ここに別のオプション:

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]

4

任意のパス文字列が与えられると、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 = PathStringInfo.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コマンドスクリプト言語とどのように異なるか、そして私が経験した他のすべてのものについて、いくつかの癖が明らかになりました。


3

PowerShell 6以降では、次のように拡張子なしのファイル名を取得します。

split-path c:\temp\myfile.txt -leafBase

これは、Powershell 6では正解です。沼地の標準5.1にはLeafBaseはありません
finlaybob

1
情報をありがとう、それに応じて回答を更新しました。沼地とは?
ルネNyffenegger

2
謝罪:)私が(イギリス)出身の場合、「Bog Standard」は完全に普通の何か、「バニラ」バージョンの俗語です。
finlaybob

2

このスクリプトは、フォルダーとサブフォルダーを検索し、拡張子を削除してファイルの名前を変更します

    Get-ChildItem -Path "C:/" -Recurse -Filter *.wctc |

    Foreach-Object {

      rename-item $_.fullname -newname $_.basename

    }

2

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

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を使用することにより、要求に応じて拡張子なしのファイル名を返します。


1
この回答を本当にありがとう、それは非常に完全で、私を助けてくれました
サム


1

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

#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

1
なぜそんなに難しい方法ですか?
JaroslavŠtreit19年

2
ファイル名に複数のピリオドが含まれている場合は機能しません。例:MyApp.exe.config
Joe
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.