powershell-извлечение имени и расширения файла
Мне нужно, чтобы извлечь имя файла и расширение, например, мой.файл.xlsx. Я не знаю имя файла или расширения, и в имени может быть больше точек, поэтому мне нужно искать строку справа, и когда я нахожу первую точку (или последнюю слева), извлеките часть с правой стороны и часть с левой стороны от этой точки.
может быть, есть лучшее решение, но я ничего не нашел здесь или где-нибудь еще. Спасибо
8 ответов:
если файл сходит с диска и как уже сказали, используйте
BaseNameиExtensionсвойства:PS C:\> dir *.xlsx | select BaseName,Extension BaseName Extension -------- --------- StackOverflow.com Test Config .xlsxЕсли вам дано имя файла как часть строки (скажем, из текстового файла), я бы использовал
GetFileNameWithoutExtensionиGetExtensionстатические методы из классаSystem.IO.Path:PS C:\> [System.IO.Path]::GetFileNameWithoutExtension("Test Config.xlsx") Test Config PS H:\> [System.IO.Path]::GetExtension("Test Config.xlsx") .xlsx
PS C:\Windows\System32\WindowsPowerShell\v1.0>split-path "H:\Documents\devops\tp-mkt-SPD-38.4.10.msi" -leaf tp-mkt-SPD-38.4.10.msi PS C:\Windows\System32\WindowsPowerShell\v1.0> $psversiontable Name Value ---- ----- CLRVersion 2.0.50727.5477 BuildVersion 6.1.7601.17514 PSVersion 2.0 WSManStackVersion 2.0 PSCompatibleVersions {1.0, 2.0} SerializationVersion 1.1.0.1 PSRemotingProtocolVersion 2.1
Если это из текстового файла и и предполагая имя файла окружены пробелами это способ:
$a = get-content c:\myfile.txt $b = $a | select-string -pattern "\s.+\..{3,4}\s" | select -ExpandProperty matches | select -ExpandProperty value $b | % {"File name:{0} - Extension:{1}" -f $_.substring(0, $_.lastindexof('.')) , $_.substring($_.lastindexof('.'), ($_.length - $_.lastindexof('.'))) }Если это файл, вы можете использовать что-то вроде этого в зависимости от ваших потребностей:
$a = dir .\my.file.xlsx # or $a = get-item c:\my.file.xlsx $a Directory: Microsoft.PowerShell.Core\FileSystem::C:\ps Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 25/01/10 11.51 624 my.file.xlsx $a.BaseName my.file $a.Extension .xlsx
PS C:\Users\joshua> $file = New-Object System.IO.FileInfo('file.type') PS C:\Users\joshua> $file.BaseName, $file.Extension file .type
Использовать Split-Path
$filePath = "C:\PS\Test.Documents\myTestFile.txt"; $fileName = (Split-Path -Path $filePath -Leaf).Split(".")[0]; $extension = (Split-Path -Path $filePath -Leaf).Split(".")[1];
Это адаптация, если кому любопытно. Мне нужно было проверить, успешно ли RoboCopy скопировал один файл на несколько серверов для его целостности:
$Comp = get-content c:\myfile.txt ForEach ($PC in $Comp) { dir "\$PC\Folder\Share\*.*" | Select-Object $_.BaseName }красиво и просто, и он показывает каталог и файл внутри него. Если вы хотите указать одно имя файла или расширение, просто замените *'s на то, что вы хотите.
Directory: \SERVER\Folder\Share Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2/27/2015 5:33 PM 1458935 Test.pptx
Comments