17

これが私がこれまでに持っているものです:

Get-ChildItem "C:\Folder" | Foreach-Object {$_.Name} > C:\Folder\File.txt

上記の出力 File.txt を開くと、次のように表示されます。

file1.txt
file2.mpg
file3.avi
file4.txt

拡張機能を削除してこれだけを表示するように出力を取得するにはどうすればよいですか。

file1
file2
file3
file4

前もって感謝します!

編集

下の仲間の助けを借りてそれを理解しました。私は最終的に使用しました:

Get-ChildItem "C:\Folder" | Foreach-Object {$_.BaseName} > C:\Folder\File.txt
4

5 に答える 5

23
Get-ChildItem "C:\Folder" | Select BaseName > C:\Folder\File.txt
于 2012-11-13T22:39:11.947 に答える
4

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()を利用する点が異なります。

于 2012-11-13T22:38:28.877 に答える
2

そして今、FileInfo バージョンについては、他の誰もが私を Path.GetFileNameWithoutExtension ソリューションに打ち負かしたからです。

Get-ChildItem "C:\" | `
where { ! $_.PSIsContainer } | `
Foreach-Object {([System.IO.FileInfo]($_.Name)).Name.Split('.')[0]}
于 2012-11-13T22:57:48.810 に答える
1

Name プロパティの代わりに BaseName プロパティを使用します。

Get-ChildItem "C:\Folder" | Select-Object BaseName > C:\Folder\File.txt
于 2012-11-13T22:39:28.433 に答える