1

Powershellはかなり新しく、誰かが私を正しい方向に向けることができることを望んでいます。私が以下に持っていることを達成するためのよりクリーンな方法があるかどうかを理解しようとしていますか?最初のGet-ChildItem呼び出し($ items変数に格納されている)中に返されるファイルにいくつかの変更を加えた後、Get-ChildItemの内容を更新する方法はありますか?

最初のforeachステートメントで、返されるすべてのファイルのログ署名を作成しています。それが終わったら、私がする必要があるのは; リストをもう一度取得すると(パス内のアイテムが変更されたため)、2番目のGet-ChildItemには、最初のGet-ChildItem呼び出し中に見つかったファイルと、最初のforeachステートメントが呼び出されたときに生成されたすべてのlogFilesの両方が含まれます。 generate-LogFile関数。だから私の質問ですが、get-chilItemを2回呼び出さずにリストを更新し、2つのforeachステートメントを使用する方法はありますか?

すべての助けをありがとう!

--------------これは私が推奨に基づいてコードを変更したものです--------------

$dataStorePath = "C:\Process"

function print-All($file)
{
    Write-Host "PrintALL filename:"  $file.FullName #Only prints when print-All($item) is called 
}

function generate-LogFile($file)
{
    $logName = $file.FullName + ".log"
    $logFilehandle = New-Object System.IO.StreamWriter $logName
    $logFilehandle.Writeline($logName)
    $logFilehandle.Close()
    return $logName
}

$items = Get-ChildItem -Path $dataStorePath

foreach ($item in $items)
{
    $log = generate-LogFile($item) #Contains full path C:\Process\$fileName.log
    print-All($item) 
    print-All($log) #When this goes to the function, nothing prints when using $file.FullName in the print-All function
}

- - - - -出力 - - - - - - -

テストのために、C:\ Processに2つのファイルがあります:fileA.txtとfileB.txt

2つの追加ファイルfileA.txt.logとfileB.txt.logを作成します

最終的には、4つのファイルすべてで何かをする必要があります。4つのファイルすべてを処理するprint-All関数を作成しました。以下は現在の出力です。ご覧のとおり、追加で作成された2つのファイルではなく、見つかった2つの元のファイルの出力のみを取得します(print-All($ log)を呼び出すときに空白行を取得します)。Get-ChildItemによって提供されるフルパスプロパティを使用できるようにする必要があるため、FullNameを使用します

PrintALL filename: fileA.txt
PrintALL filename:
PrintALL filename: fileB.txt
PrintALL filename:
4

1 に答える 1

1

作成したログ ファイルを返してから、ファイルとログ ファイルの両方をgenerate-LogFile呼び出すことができますか? generateRequestDataこのようなもの:

$items = Get-ChildItem -Path $dataStorePath
foreach ($file in $items)
{
    $logFile = generate-LogFile $file 
    generateRequestData $file
    generateRequestData $logFile
}

編集:

追加したサンプルでは、​​から文字列を返していますgenerate-LogFile。.NET 文字列にはFullNameプロパティがないため、.NET には何も出力されませんprint-AllFileInfo必要なオブジェクトを取得するには、get-itemコマンドレットを使用します。

return Get-Item $logName

また、この例では、ファイルへの書き込みに a を使用する必要はありませんStreamWriter。ネイティブの powershellOut-Fileコマンドレットを使用できます。

function generate-LogFile($file)
{
    $logName = $file.FullName + ".log"
    $logName | Out-File $logName
    return Get-Item $logName
}
于 2012-04-24T00:28:59.737 に答える