2013-02-08 11 views
9

私はpowershell 2.0スクリプトの変数に絶対パスを持っています。私は拡張機能を削除したいが、完全なパスとファイル名を保持したい。それを行う最も簡単な方法は?PowerShellで拡張子なしのファイルパスを取得するにはどうすればよいですか?

私はと呼ばれる変数にC:\Temp\MyFolder\mytextfile.fake.ext.txtを持っているのであれば、$file

は私が[string]タイプであれば

C:\Temp\MyFolder\mytextfile.fake.ext

答えて

17

を返すようにしたいと言う:[system.io.fileinfo]ある場合

$file.Substring(0, $file.LastIndexOf('.')) 

タイプ:

join-path $File.DirectoryName $file.BaseName 

またはあなたはそれをキャストすることができます

join-path ([system.io.fileinfo]$File).DirectoryName ([system.io.fileinfo]$file).BaseName 
+0

それは[文字列です。 ]タイプ。私はそれをより堅牢にして、可変長の長さに対処したいのですか? '.pl'ファイルや' .blahblah'ファイルがあるとどうなりますか? –

+1

@ MarkAllison追加されたソリューション.. –

+0

'$ file.Substring(0、$ file.LastIndexOf( '。'))'は良いものです。しかし、2つのケースを考えてみましょう。1)拡張子がなく、中央にドットがあります。 'C:\ Tests.1 \ FileNoExtension'の結果は 'C:\ Tests'になります。 2)全くドットがないと例外が発生する。 –

4
# the path 
$file = 'C:\Temp\MyFolder\mytextfile.fake.ext.txt' 

# using regular expression 
$file -replace '\.[^.\\/]+$' 

# or using System.IO.Path (too verbose but useful to know) 
Join-Path ([System.IO.Path]::GetDirectoryName($file)) ([System.IO.Path]::GetFileNameWithoutExtension($file)) 
+2

ファイルにアクセスできる場合は次も使用できます: 'Get-Item $ yourpathvar | %{$ _。FullName -replace $ _。Extension} ' –

+0

@Graimer:これは正しくないと思います。 1)文字列 '$ _。Extension 'もパスの途中にある可能性があります。 2) '[]'のような特別な正規表現を含んでいるかもしれません。 –

+0

サンプルに隠れた正規表現の文字が表示されなかったことは申し訳ありません。大部分の人は拡張機能で特殊文字を使用しません。ポイント1については、拡張子がパスの途中にあるサンプルを表示してください(存在する場合)。私は鉱山が良かったと言っているのではなく、普通の日の使用のためのバージョンを読むのが簡単です:) –

3

あなたは代わりにパスの部分を一緒にcobblingまたは交換を行うための、シンプルな.NETフレームワークのメソッドを使用する必要があります。

PS> [System.IO.Path]::GetFileNameWithoutExtension($file) 

https://msdn.microsoft.com/en-us/library/system.io.path.getfilenamewithoutextension%28v=vs.110%29.aspx

+0

OPは拡張子なしでファイル_path_を取得する方法を尋ねました。これはそうしない。むしろ ':: GetFileNameWithoutExtension()'は、パスと拡張子の両方を取り除いたファイル名を返します。 – alx9r

0

かどうかにかかわらず$filestringまたはFileInfoオブジェクトである:ここでは

(Get-Item $file).BaseName 
6

は私が好む最良の方法や他の例である:

 
$FileNamePath 
(Get-Item $FileNamePath).Extension 
(Get-Item $FileNamePath).Basename 
(Get-Item $FileNamePath).Name 
(Get-Item $FileNamePath).DirectoryName 
(Get-Item $FileNamePath).FullName 

+0

3年前から回答が受け入れられた質問に回答するのはなぜですか? –

+2

複雑なコードではなく効率的なソリューションがあるためです。 – Antebios

+0

正確に何が返されるかを示す各行の横にいくつかのコメントを書いていただければ幸いです。 – deadlydog