powershell-ファイル名と拡張子を抽出する


114

my.file.xlsxなどからファイル名と拡張子を抽出する必要があります。ファイルまたは拡張子の名前がわからず、名前にドットがさらに含まれている可能性があるため、文字列を右から検索する必要があります。最初のドット(または左から最後)が見つかったら、その部分を抽出しますその点から右側と左側の部分。

多分より良い解決策がありますが、私はここや他のどこにも何も見つかりませんでした。ありがとうございました


テキストファイルまたは何から抽出しますか?
CB。

こんにちは、クリスチャン、質問を更新しました。ファイルの名前から抽出する必要があります。ありがとう
culter 2012年

回答:


174

ファイルがディスクから出てきており、他の人が述べているように、BaseNameおよびExtensionプロパティを使用します。

PS C:\> dir *.xlsx | select BaseName,Extension

BaseName                                Extension
--------                                ---------
StackOverflow.com Test Config           .xlsx  

文字列の一部としてファイル名が指定されている場合(たとえば、テキストファイルからのもの)、System.IO.PathクラスのGetFileNameWithoutExtensionGetExtensionstaticメソッドを使用します。

PS C:\> [System.IO.Path]::GetFileNameWithoutExtension("Test Config.xlsx")
Test Config
PS H:\> [System.IO.Path]::GetExtension("Test Config.xlsx")
.xlsx

8
MSDNのドキュメントを参照することなくSystem.IO.Pathクラスで、より便利な方法については、使用することができます[System.IO.Path] | Get-Member -Static
フィル・

2
ピリオド( "。")を含む[System.IO.Path]::GetExtension拡張子返すことに注意してください。
Ohad Schneider 2016

ありがとう@OhadSchneider
m1m1k

24
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

13

テキストファイルからであり、推定名ファイルが空白で囲まれている場合、これは方法です。

$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


8

FileInfoオブジェクトのBaseNameプロパティとExtensionプロパティを確認します。


1
あなたが求めている特定の情報は?ファイルをGet-Memberにパイプしてすべてのメンバーを公開するか、MSDNを参照して公式のヘルプを探します。
Shay Levy

7

分割パスを使用

$filePath = "C:\PS\Test.Documents\myTestFile.txt";
$fileName = (Split-Path -Path $filePath -Leaf).Split(".")[0];
$extension = (Split-Path -Path $filePath -Leaf).Split(".")[1];

2
これはファイル名にピリオドがない場合にのみ機能することに注意してください。
Halfdone 2018年

2
Split(".")[-1]名前にドットが含まれるファイルで機能するように変更できます
phuclv


0

好奇心が強い人なら、これは改作です。RoboCopyがその整合性のために1つのファイルを複数のサーバーに正常にコピーしたかどうかをテストする必要がありました。

   $Comp = get-content c:\myfile.txt

ForEach ($PC in $Comp) {
    dir "\\$PC\Folder\Share\*.*" | Select-Object $_.BaseName
}

素晴らしくシンプルで、ディレクトリとその中のファイルが表示されます。1つのファイル名または拡張子を指定する場合は、*を必要なものに置き換えます。

    Directory: \\SERVER\Folder\Share

Mode                LastWriteTime     Length Name                                                                                                                                             
----                -------------     ------ ----                                                                                                                                             
-a---         2/27/2015   5:33 PM    1458935 Test.pptx                                                                                                             

0

PowerShell 6.0にSplit-Pathは、-Extenstionパラメーターがあります。これはあなたができることを意味します:

$path | Split-Path -Extension

または

Split-Path -Path $path -Extension

以下のために$path = "test.txt"両方のバージョンを返します.txt終止符をinluding、。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.