スクリプトの冒頭で、ファイル(パラメーターとして指定)が上書き可能かどうかを確認し、現在のユーザーに上書き可能な権限がない場合は終了します。
(たとえば、ユーザーまたはそのユーザーが属するグループがファイルへのアクセスを拒否された場合。)
理由:スクリプトでいくつかのデータを処理していて(時間がかかります)、最後に結果をファイルに書き込みますが、スクリプト全体が正しく実行されたのは少しイライラしますが、最後に、ファイルが書き込み可能ではないことが判明しました(最初に確認できたはずです)。
これは、fileが存在するかどうかをテストする正しい方法です:
$Outfile = "w:\Temp\non-writable-file.txt" # (normally I get this as a parameter)
$OutFileExists = Test-Path -Path $Outfile -PathType Leaf
もちろん、ファイルが存在する場合、$OutfileExists
はTrue
と等しくなります。
しかし、このファイルが書き込み可能かどうかを確認したいと思います-現在は書き込み可能ではありません(テストできるようにセキュリティ設定を自分で変更しました):
だから、私がこれを試してみると:
(Get-Acl $Outfile).Access
私はこの出力を取得します:
FileSystemRights : Write
AccessControlType : Deny
IdentityReference : Everyone
IsInherited : False
InheritanceFlags : None
PropagationFlags : None
FileSystemRights : ReadAndExecute, Synchronize
AccessControlType : Allow
IdentityReference : Everyone
IsInherited : False
InheritanceFlags : None
PropagationFlags : None
FileSystemRights : FullControl
AccessControlType : Allow
IdentityReference : DOESNTMATTER\Pete
IsInherited : False
InheritanceFlags : None
PropagationFlags : None
(この結果をフィルタリングすることもできます。)
OK、Everyoneグループには書き込みアクセス権がないことがわかりました。
しかし、このファイルの上書き可能性をエレガントにチェックする方法はまだわかりません。
私はこれを使用しました:
Try { [io.file]::OpenWrite($outfile).close() }
Catch { Write-Warning "Unable to write to output file $outputfile" }
書き込みアクセスのためにファイルを開こうとし、すぐに閉じます(実際にはファイルに何も書き込みません)。何らかの理由でファイルを開くことができない場合は、Catchブロックが実行され、そこでエラー処理を行うことができます。
次のようなファイルへのクイック書き込み(追加)を試みることができます。
"" | Out-File 'w:\Temp\non-writable-file.txt' -Append
書き込み権限が存在しない場合、エラーが発生します。
Out-File:パス 'w:\ Temp\non-writable-file.txt'へのアクセスが拒否されました。
.。
+ CategoryInfo:OpenError :( :) [Out-File]、UnauthorizedAccessException
+ FullyQualifiedErrorId:FileOpenFailure、Microsoft.PowerShell.Commands.OutFileCommand
書き込み権限が存在する場合は、そのエラーをキャッチして終了することができます。ファイルに新しい行を追加しただけです。