2016-12-25 20 views
5

Tôi tự hỏi nếu có cách nào để chạy tập lệnh PowerShell sao cho cả lệnh và đầu ra của mỗi dòng của tập lệnh được in. Ví dụ, trong Bash bạn sẽ viết bash -x myscript hoặc đặt một set -x ở đầu tập lệnh của bạn. Trong Hàng loạt, bạn sẽ bỏ qua số @echo off theo truyền thống còn lại ở đầu tập lệnh của bạn. PowerShell có tương đương với các cấu trúc này không?Làm thế nào để chạy một kịch bản PowerShell với đầu ra tiết?

Những điều tôi đã thử: Chạy powershell -? | sls verbose, không có gì.

+0

Ở nơi đầu tiên, một người dùng với đại diện của bạn đã thực hiện một nghiên cứu trước khi hỏi? [google: Echo trên powershell] (http://www.google.com/search?q=Echo+on+for+powershell&oq=Echo+on+for+powershell) – LotPings

+1

@LotPings Rất tiếc, nó không xảy ra với tôi cho Google "echo on for powershell". –

Trả lời

12

Chỉ cần đi để hiển thị, @JamesKo, nếu bạn đặt câu hỏi sai bạn nhận được câu trả lời sai :-(Một số người đưa ra câu trả lời tốt ở đây dựa trên (a) thiếu sự tiếp xúc với Linux và (b) bạn sử dụng thuật ngữ verbose.Trong phần sau tôi sẽ hướng dẫn bạn cách Linux liên quan đến PowerShell về chủ đề này, nhưng vui lòng chuyển sang câu trả lời cuối cùng nếu bạn vội vàng .--)

nền

Trong PowerShell, verbose có một ý nghĩa rất cụ thể mà PowerShell man page thậm chí còn khá mơ hồ về:

Hiển thị thông tin chi tiết về thao tác được thực hiện bởi lệnh . Thông tin này giống với thông tin trong một dấu vết hoặc trong nhật ký giao dịch . Tham số này chỉ hoạt động khi lệnh tạo ra một thông báo tiết.

Nó thậm chí có vẻ giống như những gì bạn muốn ...nhưng chúng ta hãy so sánh với các tài liệu Linux cho set -x đó, tùy thuộc vào hương vị của bạn của Linux, có thể này (từ man-pages project) ...

Vỏ sẽ viết thư cho sai số chuẩn một dấu vết cho mỗi lệnh sau nó mở rộng lệnh và trước khi nó thực thi nó.

hay này (từ gnu) ...

In một dấu vết của các lệnh đơn giản, cho các lệnh, lệnh trường hợp, chọn lệnh, và số học cho các lệnh và lập luận của họ hoặc danh sách từ liên quan sau khi chúng được mở rộng và trước khi chúng được thực thi .

Dòng đầu tiên của câu hỏi của bạn được đồng ý rõ ràng và chính xác với những câu hỏi này. Nhưng tiết trong PowerShell thì khác. Tóm lại, bật chế độ tiết (có thể là bằng công tắc dòng lệnh -Verbose hoặc biến số $VerbosePreference) chỉ đơn giản là cho phép đầu ra từ dòng chi tiết tới bàn điều khiển. (Giống như Linux cung cấp hai luồng, stdout và stderr, PowerShell cung cấp nhiều luồng: luồng đầu ra, luồng lỗi, luồng cảnh báo, luồng tiết và luồng gỡ lỗi. Bạn làm việc với các luồng này giống hệt với Linux - bạn có thể thậm chí sử dụng, ví dụ như, commands 4>&1 sáp nhập dòng verbose để stdout, ví dụ. (Bạn có thể đọc thêm về nhiều dòng sản lượng PowerShell trong phần cơ bản Viết Streams của PowerShell One-Liners: Accessing, Handling and Writing Data và tham khảo nhanh tốt là Complete Guide to PowerShell Punctuation.)

Câu trả lời

Lệnh Set-PSDebug sẽ cung cấp cho bạn truy tìm bash-equivalent. Bạn thậm chí có thể điều chỉnh chi tiết theo dõi vớiTham số. Thứ nhất, đây là sự kiểm soát, trước khi sử dụng Set-PSDebug:

PS> Get-PSDepth 
0 

Với giá trị của bạn nhận được mỗi dòng mã như nó thực thi, ví dụ:

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+ >>>> } 

Với giá trị của bạn cũng nhận được các bài tập và đường dẫn mã biến:

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+ >>>> } 

Đó là dấu vết của mô phỏng le cmdlet Tôi viết có tên là Get-PSDepth. Nó in các lệnh, nhiệm vụ, v.v. với tiền tố DEBUG, được trộn lẫn với đầu ra thực tế, trong trường hợp này là dòng đơn chứa chỉ 0.

0

Nếu bạn đang sử dụng ghi-tiết trong kịch bản của bạn này sẽ xảy ra tự động,

Tuy nhiên, nếu bạn cần phải tự viết ra verbose từ chức năng của mình, bạn sẽ cần phải tự kiểm tra xem mỗi hàm được gọi với cờ dài dòng. Điều này có thể được thực hiện bằng cách kiểm tra $ PSCmdlet.MyInvocation.BoundParameters ["Verbose"] từ bên trong chức năng của bạn.

5

Bạn luôn có thể sử dụng phần bên dưới trong tập lệnh của mình.

$ VerbosePreference = "Tiếp tục"

Lưu ý: Bạn phải mở vỏ trong chế độ cao.

Dưới đây là ảnh chụp màn hình để tham khảo.

$VerbosePreference

Hy vọng điều đó sẽ hữu ích.

0

Điều này thực sự rất dễ dàng, mỗi PowerShell CMDLET đều có thẻ Verbose được tích hợp sẵn. Tất cả những gì bạn phải làm ví dụ:

Kiểm tra kết nối -ComputerName www.google.com -Verbose

Đó là nó. Tôi hy vọng điều này sẽ giúp

Các vấn đề liên quan