0

関数でGet-ChildItemへのフィルター引数を取得する際に問題があります。

以下は正常に機能し、ファイルのリスト全体を表示します。

c:\temp\Get-ChildItem -Include *deleteme*.txt -Recurse

次のスクリプトがあるとします

#file starts here
#filename = GetLastFile.ps1

param([string] $filter)

$files = Get-ChildItem $filter

Write-Host $files #should print all matching files but prints nothing

$file = $files | Select-Object -Last 1;


$file.name  #returns filename
#File ends here

スクリプトを実行しようとすると、

c:\temp.\GetLastFile.ps1 "-Include *deleteme*.txt -Recurse"

何も返しません。

フィルタ を指定すると*.*、正常に動作します。-Includeorが原因で失敗しているよう-Excludeです。何か案は?

4

3 に答える 3

5

Powershell 2.0 プロキシ関数が役立つ領域に入り始めています。ただし、それだけではありませんが、PowerShell 2.0 でこれを行う簡単な方法を次に示します。必要なのは -Include と -Recurse だけです。実際には、代わりに -Filter を使用することをお勧めします。これは、-filter が OS によって提供されるファイルシステム フィルタリングを使用するのに対し、-include は PowerShell によって処理されるためです。

param([string]$Filter, [switch]$Recurse)

$files = Get-ChildItem @PSBoundParameters

Write-Host $files #should print all matching files but prints nothing

$file = $files | Select-Object -Last 1;

$file.name #returns filename

シンボルは、@配列またはハッシュテーブルをパラメーター全体でコマンドに「分割」するために使用されます。$PSBoundParameters 変数は、関数で定義される PowerShell 2.0 の新しい自動変数です。これは、すべての境界付き (名前付きおよび位置) パラメーターを含むハッシュテーブルです。

PS> function foo($Name,$LName,[switch]$Recurse) { $PSBoundParameters }
PS> foo -Name Keith Hill -Recurse

Key                                                         Value
---                                                         -----
Name                                                        Keith
Recurse                                                     True
LName                                                       Hill

このようなハッシュテーブルをコマンドに対してスプラットすると、PowerShell はキー (Recurse など) の値をコマンドの Recurse という名前のパラメーターにマップします。

于 2010-02-10T17:52:07.023 に答える
0

Invoke-Expression を使用して、変数に格納されたコマンドを実行できます。例えば:

param([string] $filter)
$files = Invoke-Expression "Get-ChildItem $filter"

Write-Host $files

$file = $files | Select-Object -Last 1

$file.name
于 2014-12-02T23:41:12.743 に答える
0

$filter パラメーターが Get-ChildItem コマンドの単一の文字列引数として扱われていることが原因だと思います。そのため、「-Include deleteme.txt -Recurse」という名前のディレクトリがない限り、コマンドは常に何も返しません。

問題の解決に関しては、問題に取り組む方法はたくさんあります。おそらく、より用途の広い方法の 1 つは、$filter 引数が渡された場合にプログラムの動作を切り替え、フィルター文字列全体を渡す代わりに "deleteme.txt" 文字列を渡すことです。

于 2010-02-09T15:43:11.543 に答える