2

私のアプリでは、後で実行される PowerShell スクリプトをユーザーが入力できます。ユーザーがスクリプトを入力すると、プログラムが構文エラーを報告できるように、powershell スクリプトを実行せずに検証できる簡単な方法はありますか?

ありがとう。

4

2 に答える 2

7

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 バーテック

于 2012-05-30T09:48:54.763 に答える
5

プロセスを自動化する関数を作成しました: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."
      }
   }
} 
于 2012-05-30T11:15:15.610 に答える