2010-01-10 27 views
146

Tôi đang chạy tập lệnh PowerShell từ bên trong một tệp lô. Tập lệnh tìm nạp một trang web và kiểm tra xem nội dung của trang có phải là chuỗi "OK" hay không.Cách tạo một cái gì đó trong PowerShell

Kịch bản PowerShell trả về mức lỗi cho tập lệnh theo lô.

Tập lệnh lô được thực hiện bởi ScriptFTP, một chương trình tự động hóa FTP. Nếu một lỗi xảy ra, tôi có thể có ScriptFTP gửi đầu ra bàn điều khiển đầy đủ cho người quản trị thông qua E-Mail.

Trong kịch bản PowerShell, tôi muốn xuất giá trị trả về từ trang web nếu nó không phải là "OK", do đó thông báo lỗi được đưa vào đầu ra của bàn điều khiển và do đó trong thư trạng thái.

Tôi mới sử dụng PowerShell và không chắc chắn chức năng đầu ra nào sẽ sử dụng cho việc này. Tôi có thể thấy ba:

  • Write-Host
  • Write-Output
  • Write-Lỗi

Điều gì sẽ là điều đúng đắn để sử dụng để viết thư cho tương đương với Windows của stdout?

Trả lời

152

Đơn giản chỉ cần xuất ra một cái gì đó là PowerShell là một điều đẹp - và một trong những điểm mạnh nhất của nó. Ví dụ, Hello, World phổ biến!ứng dụng được giảm xuống một dòng duy nhất:

"Hello, World!" 

Nó tạo ra một đối tượng chuỗi, gán giá trị nói trên, và là mục cuối cùng trên đường ống lệnh nó gọi phương thức .toString() và kết quả đầu ra kết quả để STDOUT (theo mặc định) . Một điều đẹp.

Các lệnh Write-* khác là cụ thể để xuất văn bản vào luồng được liên kết của chúng và đặt vị trí của chúng như vậy.

+4

Điều đó không thực sự xảy ra. Đó là một biểu thức dạng chuỗi và là thứ duy nhất trong đường ống của nó. Do đó nó tương đương với "Xin chào, Thế giới!" | Out-Host'. Mặt khác, 'Out-Host' gửi các đối tượng tới máy chủ PowerShell để hiển thị và việc thực thi nó phụ thuộc vào máy chủ. Các máy chủ bàn điều khiển gửi chúng đến xử lý đầu ra tiêu chuẩn (đi qua 'Out-Default' trên đường đi), thực sự. PowerShell ISE hiển thị chúng trong ngăn đầu ra của nó, tuy nhiên, và các máy chủ khác có thể làm những thứ khác hoàn toàn. – Joey

+3

Các đối tượng cũng không bị chuyển đổi một cách mù quáng thành chuỗi, nhưng chuyển qua một _formatter_ để quyết định phải làm gì với chúng. Đó là lý do tại sao bạn thấy đầu ra của 'Get-ChildItem' đến trong một dạng bảng, ví dụ, và kết quả với nhiều thuộc tính (ví dụ như WMI) mặc định là' Định dạng-Danh sách' thay thế. – Joey

6

Bạn có thể sử dụng bất kỳ điều nào trong số này trong trường hợp của bạn vì chúng ghi vào luồng mặc định (đầu ra và lỗi). Nếu bạn đã tạo đầu ra cho một lệnh khác, bạn sẽ muốn sử dụng Write-Output, cuối cùng sẽ kết thúc trong Write-Host.

Bài viết này mô tả các tùy chọn đầu ra khác nhau: PowerShell O is for Output

+1

Cảm ơn bạn đã liên kết. Goodness, đây là * phức tạp *. Nếu Write-host là một số loại điểm cuối hoặc chức năng xả, tôi sẽ cố gắng và đi với điều đó và báo cáo lại. –

91

Tôi nghĩ rằng trong trường hợp này, bạn sẽ cần Write-Output.

Nếu bạn có một kịch bản như

Write-Output "test1"; 
Write-Host "test2"; 
"test3"; 

sau đó, nếu bạn gọi kịch bản với sản lượng chuyển hướng, một cái gì đó giống như yourscript.ps1 > out.txt, bạn sẽ nhận được test2 trên màn hình test1\ntest3\n trong "out.txt". Lưu ý rằng "test3" và dòng Write-Output sẽ luôn thêm một dòng mới vào văn bản của bạn và không có cách nào để PowerShell dừng việc này (tức là, echo -n là không thể trong PowerShell với các lệnh gốc). Nếu bạn muốn (chức năng cơ bản và dễ dàng trong Bash) của echo -n thì hãy xem samthebest's answer.

Nếu tệp lô chạy lệnh PowerShell, rất có thể sẽ nắm bắt lệnh Ghi-xuất. Tôi đã có "cuộc thảo luận dài" với các quản trị viên hệ thống về những gì cần được viết cho bảng điều khiển và những gì không nên. Bây giờ chúng tôi đã đồng ý rằng thông tin duy nhất nếu tập lệnh được thực hiện thành công hoặc đã chết phải là bản chỉnh sửa Write-Host 'và mọi thứ mà tác giả của kịch bản có thể cần biết về thực thi (mục nào được cập nhật, trường nào được đặt, v.v.) đi đến Viết-đầu ra. Bằng cách này, khi bạn gửi một kịch bản cho người quản trị hệ thống, anh ta có thể dễ dàng runthescript.ps1 >someredirectedoutput.txt và xem trên màn hình, nếu mọi thứ đều OK. Sau đó gửi "someredirectedoutput.txt" trở lại cho các nhà phát triển.

1

Bạn chỉ đơn giản là không thể lấy PowerShell để ommit những dòng mới pesky. Không có script hoặc cmdlet nào thực hiện điều này.

Tất nhiên, Máy chủ lưu trữ là tuyệt đối vô nghĩa vì bạn không thể chuyển hướng/đường ống từ nó! Bạn chỉ cần viết cho riêng mình:

using System; 

namespace WriteToStdout 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      if (args != null) 
      { 
       Console.Write(string.Join(" ", args)); 
      } 
     } 
    } 
} 

Ví dụ:

PS C:\> writetostdout finally I can write to stdout like echo -n 
finally I can write to stdout like echo -nPS C:\> 
+0

Bạn có thể thực hiện điều này trong chính quyền năng lượng. [System.Console] :: Write ("stringy") Tuy nhiên bạn sẽ không thể chuyển hướng nó ở tất cả trong PowerShell. – Nicholi

+0

Chắc chắn bạn có thể. Xem [câu hỏi này] (http://stackoverflow.com/questions/3896258/how-to-output-text-without-newline-in-powershell) –

-10

Sử dụng một chương trình bên ngoài như từ bên trong kịch bản PowerShell của bạn:

cmd /c echo "Long string: $LongStr" 

Đây là ngu ngốc và tốn kém về mặt chạy một quá trình riêng biệt, nhưng PowerShell được thiết kế kém.

+11

Bạn rõ ràng không biết bạn đang nói về cái gì. Đủ rồi. – jebar8

+0

Tôi biết tôi không nên nhưng lol –

2
Write-Host "Found file - " + $File.FullName -ForegroundColor Magenta 

Magenta có thể là một trong những "System.ConsoleColor" giá trị Enumerator - Black, DARKBLUE, DarkGreen, DarkCyan, DarkRed, DarkMagenta, DarkYellow, Xám, DarkGray, Blue, Green, Cyan, Red, Magenta, Vàng trắng.

+ $File.FullName là tùy chọn và cho biết cách đặt biến vào chuỗi.

5

Tôi nghĩ sau đây là triển lãm tốt của Echo so với Write-Host. Lưu ý cách test() thực sự trả về một mảng các int, không phải là một int đơn lẻ vì có thể dễ dàng dẫn đến tin tưởng.

function test { 
    Write-Host 123 
    echo 456 # AKA 'Write-Output' 
    return 789 
} 

$x = test 

Write-Host "x of type '$($x.GetType().name)' = $x" 

Write-Host "`$x[0] = $($x[0])" 
Write-Host "`$x[1] = $($x[1])" 

ga ra của trên:

123 
x of type 'Object[]' = 456 789 
$x[0] = 456 
$x[1] = 789 
Các vấn đề liên quan