1

.ps1 スクリプト (Powershell) の内容を取得し、VB.NET Winform のコンテキストで実行するユーティリティに取り組んでいます。基本的に、いくつかの Powershell DLL を参照し、.ps1 ファイルを開き、テキスト行を読み取り、ボタン クリック イベントで実行される内部文字列に入力することでこれを行います。

これまでの完全なコードは次のとおりです。

    Private Function RunScript(ByVal scriptText As String) As String

    ' create Powershell runspace 
    Dim MyRunSpace As Runspace = RunspaceFactory.CreateRunspace()

    ' open it 
    MyRunSpace.Open()

    ' create a pipeline and feed it the script text 
    Dim MyPipeline As Pipeline = MyRunSpace.CreatePipeline()

    MyPipeline.Commands.AddScript(scriptText)

    ' add an extra command to transform the script output objects into nicely formatted strings 
    ' remove this line to get the actual objects that the script returns. For example, the script 
    ' "Get-Process" returns a collection of System.Diagnostics.Process instances. 
    MyPipeline.Commands.Add("Out-String")

    ' execute the script 
    Dim results As Collection(Of PSObject) = MyPipeline.Invoke()

    ' close the runspace 
    MyRunSpace.Close()

    ' convert the script result into a single string 
    Dim MyStringBuilder As New StringBuilder()

    For Each obj As PSObject In results
        MyStringBuilder.AppendLine(obj.ToString())
    Next

    ' return the results of the script that has 
    ' now been converted to text 
    Return MyStringBuilder.ToString()

End Function
' helper method that takes your script path, loads up the script 
' into a variable, and passes the variable to the RunScript method 
' that will then execute the contents 
Private Function LoadScript(ByVal filename As String) As String

    Try

        ' Create an instance of StreamReader to read from our file. 
        ' The using statement also closes the StreamReader. 
        Dim sr As New StreamReader(filename)

        ' use a string builder to get all our lines from the file 
        Dim fileContents As New StringBuilder()

        ' string to hold the current line 
        Dim curLine As String = ""

        ' loop through our file and read each line into our 
        ' stringbuilder as we go along 
        Do
            ' read each line and MAKE SURE YOU ADD BACK THE 
            ' LINEFEED THAT IT THE ReadLine() METHOD STRIPS OFF 
            curLine = sr.ReadLine()
            If curLine.Contains("") Then
                fileContents.AppendLine("$Folder=tbpath.selectedpath")
            Else
                fileContents.Append(curLine + vbCrLf)
            If curLine.Contains ($Folder="") Then
        Loop Until curLine Is Nothing

        ' close our reader now that we are done 
        sr.Close()

        ' call RunScript and pass in our file contents 
        ' converted to a string 
        Return fileContents.ToString()

長文で申し訳ありませんが気になるセリフはそのcurLine.Contains一部です。私がやろうとしているのは、行が特定の行 ( を読み取る$Folder = "") であるかどうかをパーサーに検出させ、空の引用符をテキスト ボックス ( ) に格納されているフォルダー パスに置き換えることですtbpath.selectedtext。残念ながら、Powershell スクリプトではパス文字列を引用符で囲む必要があるため (スペースがある場合に備えて)、やりたいことを実行する方法を理解するのに苦労しています。

私はそこで何をすべきですか?必要なものを新しい変数 (おそらくvbPath = tbpath.selectedtext) に組み込み、それを新しい行に入れる必要がありますか? 「ベストプラクティス」はありますか?

4

2 に答える 2

3

引用符を2倍にする

    Dim s As String = "$Folder = """""

s =

$Folder = ""

あなたのコードで

    If curLine.Contains("$Folder = """"") Then

    End If
于 2013-05-20T16:51:11.977 に答える
1

curLine.Contains()リテラル文字列をチェックしますか$Folder=""? その場合は、文字列全体を二重引用符で囲み、内側の引用符をエスケープする必要があります。二重引用符は、二重にすることでエスケープされます。また、変数を挿入する場合は、変数を文字列リテラルと連結する必要があるため、コマンドはおそらく次のようになります。

If curLine.Contains ("$Folder = """"") Then
  fileContents.Append("$Folder = """ & tbpath.selectedpath & """")
End If
于 2013-05-20T16:51:26.020 に答える