Ответ 1
Для этого есть удобный метод .NET:
C:\PS> [io.path]::GetFileNameWithoutExtension("c:\temp\myfile.txt")
myfile
У меня есть серия строк, которые являются полными путями к файлам. Я хотел бы сохранить только имя файла, без расширения файла и ведущего пути. Итак, из этого:
c:\temp\myfile.txt
к
myfile
Я действительно не итерирую через каталог, и в этом случае можно использовать нечто вроде свойства powershell basename
, но я имею дело только с строками.
Для этого есть удобный метод .NET:
C:\PS> [io.path]::GetFileNameWithoutExtension("c:\temp\myfile.txt")
myfile
Проще, чем я думал, решить проблему отображения полного пути, каталога, имени файла или расширения файла.
$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)
или
([io.fileinfo]"c:\temp\myfile.txt").basename
или
"c:\temp\myfile.txt".split('\.')[-2]
вы можете использовать свойство basename
PS II> ls *.ps1 | select basename
Вдохновленный ответом @walid2mi:
(Get-Item 'c:\temp\myfile.txt').Basename
Хотя следует отметить, что это работает только в том случае, если данный файл действительно существует.
@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]
Вот один без круглых скобок
[io.fileinfo] 'c:\temp\myfile.txt' | % basename