0

週に 1 回実行され、特定のファイル共有に対するすべてのアクセス許可を調整するスクリプトがあります。これには主に PowerShell スクリプトを使用しますが、一部で icacls.exe も実行します。ファイル数が多いため、icacls.exe実行時にエラーが発生します

スクリプトの開始時に、各顧客フォルダーのすべてのアクセス許可をリセットし、その後、そのすべての子アイテムのアクセス許可をリセットしました。これの一部は、オブジェクトの所有者をリセットすることで構成されています。

このようにicacls.exeを呼び出しています。

$ICACLSResult = icacls "$OBJPath\*" /setowner $OBJOwner /t /c /q | Out-String

次に$ICACLSResult、特定のテキストの文字列をチェックして、エラーが発生したかどうかを確認し、文字列自体をエラー メッセージに追加します。

if($ICACLSResult -notmatch "bei 0 Dateien ist ein Verarbeitungsfehler aufgetreten" -and $ICACLSResult -notmatch "Failed processing 0 files")
{
    Add-Error -SED ($ErrorMSG + $ICACLSResult) -Level 2 -AddErrorInfo $False -ExitScript $False

    Throw("AnErrorOccured")
}

ただし、変数の実際の内容は$ICACLSResult次のようになります。

Successfully processed 13970 files; Failed processing 5 files

しかし、コンソール内で同じコマンドを直接実行すると、次のようになります。

PS C:\Users\User> $ICACLSResult = icacls "$OBJPath\*" /setowner $OBJOwner /t /c /q | Out-String

D:\Folder1\Folder2\Folder3\File.txt: The system cannot find the path specified.
D:\Folder1\Folder2\Folder3\File.txt: The system cannot find the path specified.
D:\Folder1\Folder2\Folder3\File.txt: The system cannot find the path specified.
D:\Folder1\Folder2\Folder3\File.txt: The system cannot find the path specified.
D:\Folder1\Folder2\Folder3\File.txt: The system cannot find the path specified.

PS C:\Users\User>

でもまた$ICACLSResultこんな感じ。

PS C:\Users\User> $ICACLSResult
Successfully processed 13970 files; Failed processing 5 files

PS C:\Users\User>

これらの詳細なエラー メッセージがなければ、変数をログに記録して$ICACLSResultも意味がありません。失敗したファイルの数だけが示され、どのファイルが具体的にどのファイルであるかが示されるわけではないためです。

この追加情報も取得して に保存するにはどうすればよい$ICACLSResultですか? 私が欲しいのは、失敗したファイルのパスだけです。

私もこれまでに試したこと

  1. $ICACLSResult = icacls "$OBJPath\*" /setowner $OBJOwner /t /c /q 2>&1
  2. $ICACLSResult = icacls "$OBJPath\*" /setowner $OBJOwner /t /c /q 2>&1 | Out-String -Stream -Width 9999
  3. $ICACLSResult = icacls "$OBJPath\*" /setowner $OBJOwner /t /c /q

機能しない理由

  1. 情報が多すぎます。改行が含まれています
  2. 情報が多すぎます。改行が含まれています
  3. 必要な情報がまだ変数にない$ICACLSResult
4

2 に答える 2

2

出力にエラーを保持する最も簡単な方法は、cmdWindows コマンド ライン ユーティリティを使用して STDERR を STDOUT にリダイレクトすることです。リダイレクト演算子を引用符で囲んで cmd に渡します。

$log = cmd /c "2>&1" someutilityname /some /parameters

例えば:

$log = cmd /c "2>&1" icacls "$OBJPath\*" /setowner $OBJOwner /t /c /q

$log 変数は、出力文字列の配列です。

于 2016-09-06T11:51:45.967 に答える