web-dev-qa-db-ja.com

select-stringの文字列ではなく、出力ファイル名

PowerShellを使用して、特定の文字列のソースコードを「grep」しています。文字列がファイル内にある場合は、文字列を含むコード行ではなく、ファイルの名前が必要です。

また、ファイルの名前を1回だけ、ファイルが存在する回数だけリストされないようにしたいと思います。

私は現在使用しています:

_gci . -include "*.sql" -recurse | select-string -pattern 'someInterestingString'
_

これで、select-stringの出力はある種のオブジェクトであり、コンソールに表示されるのは、そのオブジェクトのToString()であることがわかりました。 _format-table_を使用して選択文字列の出力を制御できると想定し、sortを使用して個別の値のみを取得すると想定します。

しかし、それは多くの推測です。

23

私はあなたがやろうとしていることを完全には理解していないと思います。出力をファイルごとにグループ化する場合は、Format-Tableパラメーターを使用して-GroupByにパイプできます。

gci . -include "*.sql" -recurse `
    | select-string -pattern 'someInterestingString' `
    | Format-Table -GroupBy Path

他の情報なしで一致するファイルの名前のみを取得する場合は、Select-Objectパラメーターを-Uniqueとともに使用できます。

gci . -include "*.sql" -recurse `
    | select-string -pattern 'someInterestingString' `
    | Select-Object -Unique Path

ファイル名のみに関心がある場合は、名前自体が階層内に複数回表示されるかどうかに関係なく、代わりにFilenameプロパティを選択できます。


注:Get-Memberコマンドレットは、オブジェクトに存在するプロパティを把握するのに非常に役立ちます。

gci . -include "*.sql" -recurse `
    | select-string -pattern 'someInterestingString' `
    | Get-Member

代わりに、そのエイリアスgmを使用することもできます。

44
Joey

これを行うときは、-Listパラメーターを使用します-はい、コード行は表示されますが、ファイルごとに1行しか表示されません(一致するものがいくつあっても):

PS> Get-ChildItem . -r *.cs | Select-String XmlNode -list

Commands\SnapinHelp\CmdletInfo.cs:27:        public List<XmlNode> InputTypes;
Commands\SnapinHelp\GetSnapinHelpCommand.cs:124:            WriteXmlNodeList(c...
Commands\SnapinHelp\ParameterInfo.cs:73:        XmlNode FindNode(XmlDocument doc)
Commands\Xml\XmlCommandBase.cs:65:            RegisterInputType<XmlNode>(Proce...

パスが必要な場合:

PS> Get-ChildItem . -r *.cs | Select-String XmlNode -list | 
    Format-Table Path

Path
--------
C:\Users\Keith\Pscx\Src\PscxSnapin\Commands\SnapinHelp\CmdletInfo.cs
C:\Users\Keith\Pscx\Src\PscxSnapin\Commands\SnapinHelp\GetSnapinHelpCommand.cs
C:\Users\Keith\Pscx\Src\PscxSnapin\Commands\SnapinHelp\ParameterInfo.cs
C:\Users\Keith\Pscx\Src\PscxSnapin\Commands\Xml\XmlCommandBase.cs

または、本当にファイル名だけが必要な場合:

PS> Get-ChildItem . -r *.cs | Select-String XmlNode -list | 
    Format-Table Filename

Filename
--------
CmdletInfo.cs
GetSnapinHelpCommand.cs
ParameterInfo.cs
XmlCommandBase.cs
14
Keith Hill

やりやすいと思いました

(...|select-string "search").Path
2
Austin_Anderson