powershell - 在 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>
如您所见,它不包含命令行。
解决方案
我期望有四个答案,而您已经提到了三个对您不起作用的答案(Set-PSDebug
, Start-Transaction
, -Verbose
)。尽管它们可能是可行的,但不是您正在寻找的格式,我不会再谈论它们了。
对于第三个选项,请尝试使用Get-History
. 现在,这不会像我假设的那样在您执行它时打印出每个命令(仅在您调用它时)。它也可能不会打印出另一个脚本中的每一行(您想要跟踪但您不喜欢那样,因为它打印出的不仅仅是执行)。
您可以尝试在PowerShell 存储库中询问,但我不希望您找到您正在寻找的内容。
推荐阅读
- javascript - 为什么我在 iframe 中推送的脚本在父级中执行?
- python - 什么是 c++ 版本的 tensorrt.volume?
- reactjs - 使用特异性级别为 1 的 styled-components 定位子元素
- laravel - ADLDAP openLDAP 身份验证 - 未存储会话 - 返回登录页面
- firebase - 请帮助我 CloudFirestorePlugin.java 使用或覆盖已弃用的 API。(未经检查或不安全的操作。)
- java - 包含特定元素的列表
- mysql - 如何在没有 WHERE 的情况下计算连接表上的行数
- windows - 屏幕(虚拟)键盘在 Win10 中如何工作
- perl - Sendmail 使用 localhost.localdomain
- python - Python:需要文件的Popen-ing命令,用字符串替换文件?