如何调试从c#执行的powershell脚本?

本文关键字:执行 powershell 脚本 何调试 调试 | 更新日期: 2023-09-27 18:14:29

我的代码通过使用c#中的System.Management.Automation命名空间来运行powershell脚本,类似于下面的代码。

 using (mPowershell = PowerShell.Create()) 
 {
        mPowershell.AddScript(GetScriptText(mStep), true);
        SetPowershellVariables(mPowershell);
        output = new PSDataCollection<PSObject>();
        output.DataAdded += new EventHandler<DataAddedEventArgs>(Output_DataAdded);
        mPowershell.InvocationStateChanged += new EventHandler<PSInvocationStateChangedEventArgs>(Powershell_InvocationStateChanged);
        IAsyncResult asyncResult = mPowershell.BeginInvoke<PSObject, PSObject>(null, output);      
}

正如预期的那样,我得到了错误,我想调试它们。

有没有一种方法,不进入powershell脚本,每2行放一个Write-Host $somevariable,一步一步调试这个脚本?

我应该提到脚本本身不能独立运行,c#代码将变量添加到脚本的运行空间。

如何调试从c#执行的powershell脚本?

可以使用脚本Add-Debugger.ps1。UI非常原始,只有一个输入对话框和一个输出控制台,为了调试,您必须在脚本中添加一些临时代码。但是,如果没有更好的选择,这样的调试器仍然可以很好地完成工作。

为了添加和触发调试而添加到脚本中的临时代码

# Add debugger with file output shown in a separate console.
# <path'> may be omitted if Add-Debugger.ps1 is in the path.
<path'>Add-Debugger.ps1 $env:TEMP'debug.log
# set some breakpoints
$null = Set-PSBreakpoint ...

从现在起,当一个断点被触发时,将显示一个调试器输入框。输入命令,检查变量,在输出控制台中观察输出。可用命令集:

s, StepInto  Step to the next statement into functions, scripts, etc.
v, StepOver  Step to the next statement over functions, scripts, etc.
o, StepOut   Step out of the current function, script, etc.
c, Continue  Continue operation (also on empty input).
q, Quit      Stop operation and exit the debugger.
?, h         Write this help message.
k            Write call stack (Get-PSCallStack).
K            Write detailed call stack using Format-List.
<n>          Write debug location in context of <n> lines.
+<n>         Set location context preference to <n> lines.
k <s> <n>    Write source at stack <s> in context of <n> lines.
w            Restart watching the debugger output file.
r            Write last PowerShell commands invoked on debugging.
<command>    Invoke any PowerShell <command> and write its output.