我想知道是否有方法來運行PowerShell腳本,以便打印腳本的每一行命令和輸出。例如,在Bash中,您可以編寫bash -x myscript
或在腳本的頂部放置一個set -x
。在批處理中,您會忽略傳統上留在腳本頂部的@echo off
。 PowerShell是否具有這些結構的等價物?如何運行帶有詳細輸出的PowerShell腳本?
事情我已經嘗試:運行powershell -? | sls verbose
,這卻一無所獲。
我想知道是否有方法來運行PowerShell腳本,以便打印腳本的每一行命令和輸出。例如,在Bash中,您可以編寫bash -x myscript
或在腳本的頂部放置一個set -x
。在批處理中,您會忽略傳統上留在腳本頂部的@echo off
。 PowerShell是否具有這些結構的等價物?如何運行帶有詳細輸出的PowerShell腳本?
事情我已經嘗試:運行powershell -? | sls verbose
,這卻一無所獲。
只是去展示,@JamesKo,如果你問錯誤的問題,你會得到錯誤的答案:-(有幾個人提出了誠意的答案,基於(a)缺乏Linux暴露和(b)您使用術語詳細。下面我將引導您瞭解Linux與PowerShell在這個主題上的關係,但如果您急於開始,請隨時跳到答案。:-)
背景
在PowerShell中,詳細有着非常特定的含義,其中PowerShell man page甚至是相當模糊的約:
顯示有關由 命令執行的操作的詳細信息。此信息與事務日誌中的跟蹤信息或 中的信息相似。該參數僅在命令生成詳細消息時才起作用 。
它甚至聽起來像你想要的...但讓我們比較,爲Linux的文檔set -x
這取決於你的Linux的味道,可能是這(從man-pages project)...
外殼應 後標準錯誤寫在每個命令痕跡它擴展命令並在執行之前。
或本(從gnu)...
打印簡單的命令一絲爲命令,命令的情況下,選擇 命令和算術的命令及其參數或 相關單詞列表在它們被擴大之後並且在它們被執行之前 。
您問題的第一行清晰簡潔地與這些一致。但是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等價的跟蹤,你甚至可以用來調整跟蹤細節參數。首先,這裏的控制,採用Set-PSDebug
前:
PS> Get-PSDepth
0
隨着一個值,你得到的每行代碼,因爲它執行,如:
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+ >>>> }
隨着值你也可以得到變量賦值和代碼路徑:
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+ >>>> }
那些是一個簡單的le cmdlet我寫的叫Get-PSDepth
。它用前綴DEBUG
打印命令,賦值等,並與實際輸出混合在一起,在這種情況下,該輸出是僅包含0
的單行。
如果您使用寫詳細的腳本,這將自動發生,
但是,如果你需要手動編寫從功能的詳細輸出,您需要手動檢查每個函數被調用與詳細的旗幟。這可以通過從函數內部檢查$ PSCmdlet.MyInvocation.BoundParameters [「詳細」] 來完成。
這實際上是非常簡單的,每個PowerShell CMDLET都有一個內置的Verbose標籤。所有你必須例如做:
測試,連接-ComputerName www.google.com -Verbose
這就是它。我希望這可以幫助
首先,有問題的用戶應該在詢問之前做一些調查? [google:Echo on PowerShell](http://www.google.com/search?q=Echo+on+for+powershell&oq=Echo+on+for+powershell) – LotPings
@LotPings對不起,它沒有發生在我身上谷歌「回聲的PowerShell」。 –