gpt4 book ai didi

windows - 如何运行带有详细输出的 PowerShell 脚本?

转载 作者:可可西里 更新时间:2023-11-01 12:26:21 24 4
gpt4 key购买 nike

我想知道是否有一种方法可以运行 PowerShell 脚本,以便打印命令和脚本每一行的输出。例如,在 Bash 中,您可以编写 bash -x myscript 或将 set -x 放在脚本的顶部。在 Batch 中,您可以省略传统上留在脚本顶部的 @echo off。 PowerShell 是否具有这些构造的等效项?

我尝试过的事情: 运行 powershell -? | sls verbose,什么也没发现。

最佳答案

只是为了表明,@JamesKo,如果你问错了问题,你会得到错误的答案:-(。一些人在这里基于 (a) 缺乏 Linux 接触和 (b) 你的使用提出了善意的答案verbose 一词。在下文中,我将向您介绍 Linux 与 PowerShell 在这个主题上的关系,但如果您赶时间,请随时跳到最后的答案。:-)

背景

在 PowerShell 中,verbose 具有非常具体的含义,PowerShell man page甚至对:

Displays detailed information about the operation performed by the command. This information resembles the information in a trace or in a transaction log. This parameter works only when the command generates a verbose message.

它甚至听起来像你想要的......但让我们将其与 set -x 的 Linux 文档进行比较,根据你的 Linux 风格,它可能是这样的(来自 man-pages project ) ...

The shell shall write to standard error a trace for each command after it expands the command and before it executes it.

或者这个(来自 gnu )...

Print a trace of simple commands, for commands, case commands, select commands, and arithmetic for commands and their arguments or associated word lists after they are expanded and before they are executed.

您问题的第一行清楚而简洁地同意这些。但是 PowerShell 中的冗长是不同的。简而言之,打开详细模式(使用 -Verbose 命令行开关或 $VerbosePreference 变量)只是启用从详细流到控制台的输出。 (就像 Linux 提供两种流,stdout 和 stderr,PowerShell 提供多种流:输出流、错误流、警告流、详细流和调试流。您可以以与 Linux 相同的方式使用这些流——您可以例如,甚至可以使用 commands 4>&1 将详细流合并到 stdout。(您可以在 PowerShell One-Liners: Accessing, Handling and Writing Data 的基本写入流部分阅读更多关于 PowerShell 的多个输出流的信息,以及一个很好的快速引用是 Complete Guide to PowerShell Punctuation 。)

答案

Set-PSDebug命令将为您提供等效于 bash 的跟踪。您甚至可以使用 -Trace 参数调整跟踪细节。首先,这里是控件,在使用 Set-PSDebug 之前:

PS> Get-PSDepth
0

如果值为 1,您会在执行时得到每一行代码,例如:

PS> Set-PSDebug -Trace 1
PS> Get-PSDepth
DEBUG: 1+ >>>> Get-PSDepth
DEBUG: 141+ >>>> {
DEBUG: 142+ >>>> $nest = -1
DEBUG: 143+ >>>> $thisId = $pid
DEBUG: 144+ while ( >>>> (ps -id $thisId).Name -eq 'powershell') {
DEBUG: 145+ >>>> $thisId = (gwmi win32_process -Filter "processid='$thisId'").ParentProcessId
DEBUG: 146+ >>>> $nest++
DEBUG: 144+ while ( >>>> (ps -id $thisId).Name -eq 'powershell') {
DEBUG: 148+ >>>> $nest
0
DEBUG: 149+ >>>> }

如果值为 2,您还可以获得变量赋值和代码路径:

PS> Set-PSDebug -Trace 2
PS> Get-PSDepth
DEBUG: 1+ >>>> Get-PSDepth
DEBUG: ! CALL function '<ScriptBlock>'
DEBUG: 141+ >>>> {
DEBUG: ! CALL function 'Get-PSDepth' (defined in file 'C:\Users\msorens\Documents\WindowsPowerShell\profile.ps1')
DEBUG: 142+ >>>> $nest = -1
DEBUG: ! SET $nest = '-1'.
DEBUG: 143+ >>>> $thisId = $pid
DEBUG: ! SET $thisId = '9872'.
DEBUG: 144+ while ( >>>> (ps -id $thisId).Name -eq 'powershell') {
DEBUG: 145+ >>>> $thisId = (gwmi win32_process -Filter "processid='$thisId'").ParentProcessId
DEBUG: ! SET $thisId = '10548'.
DEBUG: 146+ >>>> $nest++
DEBUG: ! SET $nest = '0'.
DEBUG: 144+ while ( >>>> (ps -id $thisId).Name -eq 'powershell') {
DEBUG: 148+ >>>> $nest
0
DEBUG: 149+ >>>> }

这些是我编写的名为 Get-PSDepth 的简单 cmdlet 的踪迹。它打印带有 DEBUG 前缀的命令、赋值等,与实际输出混合在一起,在本例中是仅包含 0 的单行。

关于windows - 如何运行带有详细输出的 PowerShell 脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41324882/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com