首页 > 解决方案 > 在 powershell 中“回显”或者如何让 Powershell 输出所有命令的命令行,包括脚本调用的本机命令?

问题描述

我的问题似乎与PowerShell "echo on"重复,但事实并非如此。

我对捕获命令输出不感兴趣,而是对脚本执行的每个命令的命令行本身感兴趣,包括本机命令。

这就是 cmd 中的“回显”所做的,这就是我正在寻找的。Set-PSDebug -Trace 1不这样做,也不通过-Verbose标志。

到目前为止,除了自己输出它们之外,我还没有看到其他方法,这本身就是一个巨大的痛苦。

那么,Powershell 可以做 cmd 中的“echo on”吗?

编辑 1

不理想,但我会接受一个建议使用包装函数的答案,该函数将接收带有参数的命令(本机或 powershell)并运行命令,同时忠实地记录相应的命令行。当然,包装函数代码应该是答案的一部分。

编辑 2

下面的简单示例演示了为什么Set-PSDebug -Trace 1不这样做:

tasklist `
    /fi "status eq running" | Select-Object -First 4

请注意:

C:\> cat C:\temp\1.ps1
tasklist `
    /fi "status eq running" | Select-Object -First 4
C:\> Set-PSDebug -Trace 1
C:\> C:\temp\1.ps1
DEBUG:    1+  >>>> C:\temp\1.ps1
DEBUG:    1+  >>>> tasklist `

Image Name                     PID Session Name        Session#    Mem Usage
========================= ======== ================ =========== ============
csrss.exe                      756 Console                    1      2,816 K
C:\>

编辑 3

为了比较,请观察 cmd 中的等效脚本echo on

C:\>type c:\temp\1.cmd
@echo on
tasklist ^
    /fi "status eq running" |findstr/n ^^|findstr "^[1-4]:"
C:\>c:\temp\1.cmd

C:\>tasklist     /fi "status eq running"   | findstr/n ^  | findstr "^[1-4]:"
1:
2:Image Name                     PID Session Name        Session#    Mem Usage
3:========================= ======== ================ =========== ============
4:csrss.exe                      756 Console                    1      2,328 K

C:\>

编辑 4

start-transcript也不这样做:

C:\WINDOWS\system32> cat c:\temp\1.ps1
tasklist `
    /fi "status eq running" | Select-Object -First 4 | Out-Default
C:\WINDOWS\system32> Start-Transcript
Transcript started, output file is ~\Documents\PowerShell_transcript.L-PF0TBKV7.Sr1ntThx.20190611143800.txt
C:\WINDOWS\system32> c:\temp\1.ps1

Image Name                     PID Session Name        Session#    Mem Usage
========================= ======== ================ =========== ============
csrss.exe                      756 Console                    1      2,936 K
C:\WINDOWS\system32> Stop-Transcript
Transcript stopped, output file is ~\Documents\PowerShell_transcript.L-PF0TBKV7.Sr1ntThx.20190611143800.txt
C:\WINDOWS\system32> cat ~\Documents\PowerShell_transcript.L-PF0TBKV7.Sr1ntThx.20190611143800.txt
**********************
Windows PowerShell transcript start
Start time: 20190611143800
Username: xyz\me
RunAs User: xyz\me
Configuration Name:
Machine: L-PF0TBKV7 (Microsoft Windows NT 10.0.16299.0)
Host Application: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Process ID: 25508
PSVersion: 5.1.16299.1004
PSEdition: Desktop
PSCompatibleVersions: 1.0, 2.0, 3.0, 4.0, 5.0, 5.1.16299.1004
BuildVersion: 10.0.16299.1004
CLRVersion: 4.0.30319.42000
WSManStackVersion: 3.0
PSRemotingProtocolVersion: 2.3
SerializationVersion: 1.1.0.1
**********************
Transcript started, output file is ~\Documents\PowerShell_transcript.L-PF0TBKV7.Sr1ntThx.20190611143800.txt
C:\WINDOWS\system32
>
PS>c:\temp\1.ps1

Image Name                     PID Session Name        Session#    Mem Usage
========================= ======== ================ =========== ============
csrss.exe                      756 Console                    1      2,936 K
C:\WINDOWS\system32
>
PS>Stop-Transcript
**********************
Windows PowerShell transcript end
End time: 20190611143810
**********************
C:\WINDOWS\system32>

如您所见,它不包含命令行。

标签: powershell

解决方案


我期望有四个答案,而您已经提到了三个对您不起作用的答案(Set-PSDebug, Start-Transaction, -Verbose)。尽管它们可能是可行的,但不是您正在寻找的格式,我不会再谈论它们了。

对于第三个选项,请尝试使用Get-History. 现在,这不会像我假设的那样在您执行它时打印出每个命令(仅在您调用它时)。它也可能不会打印出另一个脚本中的每一行(您想要跟踪但您不喜欢那样,因为它打印出的不仅仅是执行)。

您可以尝试在PowerShell 存储库中询问,但我不希望您找到您正在寻找的内容。


推荐阅读