0

のように機能する PowerShell コマンドレット スクリプトを作成したいと思いますOut-Stringが、行の幅は無制限で、行末に特定の幅のパディングはありません。

次のコードのような出力が必要ですが、最大行幅がなく、行の入力に実際にある末尾の空白が保持されることが望ましい場合を除きます。

$x = ls;
[regex]::Replace(($x| Out-String -Width 1024), "\ +([\r\n])", '$1');

(直接印刷$x | Out-String -Width 1024すると、行末に余分なスペースが表示されます。)

4

1 に答える 1

1

Out-String次のようなものを使用して、「飾り気のない」実装を簡単に作成できます。

filter ConvertTo-String { "$_" }

これにより、フィルターに渡されたすべてのオブジェクトが強制的に文字列になります (PowerShell 文字列拡張を使用してToStringnull 以外のオブジェクトを呼び出し$null、空の文字列に変更します)。

以下の 5 つの要素の入力例に対してフィルターを実行すると、フィルターはそれらを対応する文字列値に変換します (整数は'1'、 double '2.3'、 null ''、 string 'four'、および hashtable になります'System.Collections.Hashtable')。

1,2.3,$null,'four',@{five=6} | ConvertTo-String


Get-ChildItem(alias ) の出力に対してフィルターを実行すると、ls同様の結果が得られます。

PS> Get-ChildItem

    Directory: C:\Windows\System32\WindowsPowerShell\v1.0

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----       13 Jul 2009  11:56 PM            en-US
d----       13 Jul 2009  11:52 PM            Examples
d----       13 Jul 2009  11:52 PM            Modules
-a---       13 Jul 2009   8:14 PM     452608 powershell.exe
-a---       12 May 2012  10:28 AM        436 powershell.exe.config
...

PS> Get-ChildItem | ConvertTo-String
en-US
Examples
Modules
powershell.exe
powershell.exe.config
...


オブジェクトを文字列に変換すると、オブジェクトに元々含まれていた情報と機能が失われます。

  • ハッシュテーブルを文字列に変換すると、その型名が得られます。ハッシュテーブルの にアクセスするCountことも、その要素について何も知ることもできません。
  • ファイル システム オブジェクトを文字列に変換すると、アイテムが要求された場所からの相対パスが得られます。アイテムのフル パスにアクセスしたり、 を取得したり、ファイル アイテムの をLastWriteTime判別したり、アイテムファイルかディレクトリかを (追加の呼び出しを行わずに)Lengthテストしたりすることはできません。

実際、元のオブジェクト文字列の場合にのみ、安全な変換を行うことができます。これは、「末尾の空白」が存在する唯一の場合でもあります。

(言い換えれば、文字列ベースのシェルの制限をエミュレートしようとするよりも、できるだけ長くオブジェクトに固執する方が一般的に良い方法です;-)

于 2013-04-07T17:39:46.197 に答える