2013-02-08 76 views
9

我的PowerShell 2.0腳本中有一個變量的絕對路徑。我想剝離擴展名,但保留完整路徑和文件名。最簡單的方法來做到這一點?如何在PowerShell中獲取沒有擴展名的文件路徑?

所以,如果我有C:\Temp\MyFolder\mytextfile.fake.ext.txt在一個名爲變量,說$file

我想回到

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

回答

17

如果是一個[string]類型:如果是[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

對不起,我沒有在他的示例中看到隱藏的正則表達式字符。大多數人在擴展中不使用特殊字符。至於你的觀點,請向我展示一個樣本,其中的擴展名位於路徑中間(存在)。我不是說我的是更好的,只是一個更容易閱讀的版本,正常的一天使用:) –

0

無論$file是否stringFileInfo對象:

(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

爲什麼人們回答三年前有答案的問題? –

+2

因爲有更高效的解決方案而不是複雜的代碼。 – Antebios

+0

如果您在每一行旁邊提供了一些評論,那麼這將會很好,這些評論會顯示返回的內容。 – deadlydog

相關問題