Подтвердить что ты не робот

Удаление пути и расширение из имени файла в powershell

У меня есть серия строк, которые являются полными путями к файлам. Я хотел бы сохранить только имя файла, без расширения файла и ведущего пути. Итак, из этого:

c:\temp\myfile.txt

к

myfile

Я действительно не итерирую через каталог, и в этом случае можно использовать нечто вроде свойства powershell basename, но я имею дело только с строками.

4b9b3361

Ответ 1

Для этого есть удобный метод .NET:

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

Ответ 2

Проще, чем я думал, решить проблему отображения полного пути, каталога, имени файла или расширения файла.

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

Ответ 3

или

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

или

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

Ответ 4

вы можете использовать свойство basename

PS II> ls *.ps1 | select basename

Ответ 5

Вдохновленный ответом @walid2mi:

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

Хотя следует отметить, что это работает только в том случае, если данный файл действительно существует.

Ответ 6

@Keith,

здесь другой вариант:

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]

Ответ 7

Вот один без круглых скобок

[io.fileinfo] 'c:\temp\myfile.txt' | % basename