GetFileNameWithoutExtension
ファイル名をメソッドに渡して拡張子を削除します。
Get-ChildItem "C:\Folder" | `
ForEach-Object { [System.IO.Path]::GetFileNameWithoutExtension($_.Name) } `
> C:\Folder\File.txt
@MatthewMartin の answerについてコメントしたいと思います。これは、着信ファイル名を.
文字で分割し、結果の配列の最初の要素を返します。これは 0 または 1 の名前には機能します.
が、それ以外の場合は正しくない結果になります。
file.ext1.ext2
収量file
powershell.exe is good for me. Let me explain to thee..doc
収量powershell
その理由は、実際にはlast の前のすべてであるべきなのに、最初 の前のすべてを返しているからです。これを修正するには、名前を で区切られたセグメントに分割したら、最後のセグメントを除くすべてのセグメントを で区切って結合します。名前に a が含まれていない場合は、名前全体を返します。.
.
.
.
.
ForEach-Object {
$segments = $_.Name.Split('.')
if ($segments.Length -gt 1) {
$segmentsExceptLast = $segments | Select-Object -First ($segments.Length - 1)
return $segmentsExceptLast -join '.'
} else {
return $_.Name
}
}
より効率的な方法は、名前を 1 文字ずつ逆方向にたどることです。現在の文字が の場合、現在の文字.
までの名前を返しますが、現在の文字は含まれません。見つからない場合.
は、名前全体を返します。
ForEach-Object {
$name = $_.Name;
for ($i = $name.Length - 1; $i -ge 0; $i--) {
if ($name[$i] -eq '.') {
return $name.Substring(0, $i)
}
}
return $name
}
この[String]
クラスは、これと同じことを行うメソッドをすでに提供しているため、上記は次のように縮小できます...
ForEach-Object {
$i = $_.Name.LastIndexOf([Char] '.');
if ($i -lt 0) {
return $_.Name
} else {
return $_.Name.Substring(0, $i)
}
}
これらの 3 つのアプローチはすべて、0、1、または複数の.
文字を含む名前に対して機能しますが、もちろん、他の回答よりもはるかに冗長です。実際、LastIndexOf()
は内部で使用するものですが、GetFileNameWithoutExtension()
使用するものBaseName
は機能的に呼び出しと同じですが、既に計算された拡張機能$_.Name.Substring()
を利用する点が異なります。