2016-12-25 68 views
5

我想知道是否有方法來運行PowerShell腳本,以便打印腳本的每一行命令和輸出。例如,在Bash中,您可以編寫bash -x myscript或在腳本的頂部放置一個set -x。在批處理中,您會忽略傳統上留在腳本頂部的@echo off。 PowerShell是否具有這些結構的等價物?如何運行帶有詳細輸出的PowerShell腳本?

事情我已經嘗試:運行powershell -? | sls verbose,這卻一無所獲。

+0

首先,有問題的用戶應該在詢問之前做一些調查? [google:Echo on PowerShell](http://www.google.com/search?q=Echo+on+for+powershell&oq=Echo+on+for+powershell) – LotPings

+1

@LotPings對不起,它沒有發生在我身上谷歌「回聲的PowerShell」。 –

回答

12

只是去展示,@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的單行。

0

如果您使用寫詳細的腳本,這將自動發生,

但是,如果你需要手動編寫從功能的詳細輸出,您需要手動檢查每個函數被調用與詳細的旗幟。這可以通過從函數內部檢查$ PSCmdlet.MyInvocation.BoundParameters [「詳細」] 來完成。

5

您可以隨時在腳本中使用以下內容。

$ VerbosePreference = 「繼續」

注:你有提升模式打開外殼。

下面的截圖僅供參考。

$VerbosePreference

希望它有幫助。

0

這實際上是非常簡單的,每個PowerShell CMDLET都有一個內置的Verbose標籤。所有你必須例如做:

測試,連接-ComputerName www.google.com -Verbose

這就是它。我希望這可以幫助