私のアプリでは、後で実行される PowerShell スクリプトをユーザーが入力できます。ユーザーがスクリプトを入力すると、プログラムが構文エラーを報告できるように、powershell スクリプトを実行せずに検証できる簡単な方法はありますか?
ありがとう。
私のアプリでは、後で実行される PowerShell スクリプトをユーザーが入力できます。ユーザーがスクリプトを入力すると、プログラムが構文エラーを報告できるように、powershell スクリプトを実行せずに検証できる簡単な方法はありますか?
ありがとう。
PowerShell v2 には、スクリプトを実行せずに処理できるトークナイザーがあります。クラス System.Management.Automation.PSParser を見てください。これは静的メソッド Tokenize です。
http://msdn.microsoft.com/en-us/library/system.management.automation.psparser(v=vs.85).aspx
v3 ではさらに良くなり、言語全体の名前空間/AST サポートがあります。
http://msdn.microsoft.com/en-us/library/system.management.automation.language(v=vs.85).aspx
HTH バーテック
プロセスを自動化する関数を作成しました:Test-PSScript、ブログで見つけることができます
#Requires -Version 2
function Test-PSScript
{
param(
[Parameter(Mandatory=$true, Position=0, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)]
[ValidateNotNullOrEmpty()]
[Alias('PSPath','FullName')]
[System.String[]] $FilePath,
[Switch]$IncludeSummaryReport
)
begin
{
$total=$fails=0
}
process
{
$FilePath | Foreach-Object {
if(Test-Path -Path $_ -PathType Leaf)
{
$Path = Convert-Path –Path $_
$Errors = $null
$Content = Get-Content -Path $path
$Tokens = [System.Management.Automation.PsParser]::Tokenize($Content,[ref]$Errors)
if($Errors)
{
$fails+=1
$Errors | Foreach-Object {
$_.Token | Add-Member -MemberType NoteProperty -Name Path -Value $Path -PassThru | `
Add-Member –MemberType NoteProperty -Name ErrorMessage -Value $_.Message -PassThru
}
}
$total+=1
}
}
}
end
{
if($IncludeSummaryReport)
{
Write-Host "`n$total script(s) processed, $fails script(s) contain syntax errors."
}
}
}