2011-05-27 88 views
13

我想從日誌文件中收集腳本中的所有輸出,並且必須使用寫主機的寫輸出instaed。在寫輸出中避免換行

Write-Output "Server:" $a看起來像

Server:
foo

我真的有寫來寫
write-output $("sfdghk:" + $a)得到Server:Foo

感謝 -jt

+8

'寫輸出 「服務器:$ A」' – 2011-05-27 22:30:28

+1

@empo:您應該提交這作爲一個答案。在我看來,它比迄今爲止唯一的答案更直接和相關。 – 2011-05-27 23:54:33

回答

6

9小時......我開始一個答案。

在Powershell中,你操縱的所有東西都是一個對象。

所以「服務器:」是一個對象,$ a是一個對象

PS> "server :".gettype() 

IsPublic IsSerial Name          BaseType 
-------- -------- ----          -------- 
True  True  String         System.Object 

Write-output是把對象的一種列表(管道)的由其他cmdlet或腳本中使用的cmdlet的。所以在「Server:」和「foo」之間沒有真正的換行符。這是控制檯顯示對象列表(數組)的方式。正如你可以在這裏看到的:

PS> $a = "foo" 
PS> (Write-Output "Server :" $a).gettype() 

IsPublic IsSerial Name          BaseType 
-------- -------- ----          -------- 
True  True  Object[]         System.Array 

顯然這裏是一個抽象,但我希望它能讓你理解。

15

在互聯網上發現某處:

Write-Output "Server: $($a)" 

在我的代碼的偉大工程。

+4

對於這個例子,'$(...)'結構是多餘的,因爲它表示將括號內的所有內容視爲腳本而不是文本。由於'$ a'已經被解釋並插入到帶引號的字符串中,所以不需要添加包裝。 '寫輸出「服務器:$ a」' ...將正常工作。 當您嘗試訪問變量的方法或屬性時,使用包裝器$()。 '$ a =「我喜歡雞蛋。」 寫輸出「字符計數:$($ a.length)」'會打印出'我喜歡eggs..length'而沒有'$(...)'包裝器。 – HipCzeck 2015-01-15 17:19:13

+0

謝謝你,你救了我一天!我認爲這是powershell的設計問題,它不應該讓方式如此不同於另一個腳本語言。 – ariso 2017-04-20 16:10:19

4
Write-Output "Server: $a" 
Write-Output ("Server: {0}" -f $a) 
Write-Output ("Server: " + $a) 

如果要將腳本的輸出收集到日誌文件中,請考慮使用Start-Transcript。它將每個命令和所有PowerShell輸出記錄到文件中。它不記錄但是發送到標準輸出,任何東西,所以如果你使用的任何傳統的命令,你必須管其輸出到Write-Host

Start-Transcript C:\logs\mylog.txt 
Write-Host "Server: " $a 
ping | Write-Host 
+1

PowerShell的_equivalent_ to stdout是_success輸出流_,並且發送的東西_do_被記錄。過去的'Write-Host'沒有寫入_stdout_,而是直接打印到console_,這就是爲什麼這樣的輸出沒有顯示在轉錄本中。然而,在PSv5 +中,現在寫入'Write-Host' /'Out-Host'寫入新引入的_information stream_(與新的'Write-Information' cmdlet一樣),現在_does_被記錄。你可以使用'$ null = ...'完全抑制輸出,或者在這種情況下模擬PSv4- Write-Host'行爲,使用'$ host.ui.WriteLine()'。 – mklement0 2018-01-22 18:08:42

0

有在現有的答案良好的信息,但讓我試圖以務實的總結:

  • 當打印到控制檯重定向到一個文件Write-Output由分離參數換行符分別爲

  • 因此,以便產生單行輸出,必須「預裝配」的部分輸出到一個單一你傳遞作爲單個參數。

  • 除了打壓集合,你一般不需要使用Write-Output明確的枚舉,因爲PowerShell的默認發送未在變量捕獲或重定向到其他地方或通過管道送到什麼[成功]輸出流(其中Write-Output也寫入);因此,在當前情況下,以下就足夠了:

"Server: $a" # what this expandable string expands to is *implicitly* output 

什麼可困惑的是,Write-Host cmdlet的行爲不同,但要注意,它有它的重要一個不同的目的

# IMPORTANT: Do not use Write-Host to output *data*; only use it to write 
#   directly to the host (console). 
> Write-Host "Server:"  $a # multiple spaces used on purpose 
Server: srv1 

Write-Host,不像Write-Output,分離由單個空格每個多個參數。
還有其他重要的區別,我的this answer總結。


鑑於問題的通用名稱,我們還解決了如何抑制換行符

  • 要打印控制檯只有,您可以使用Write-Host -NoNewline

  • 隨着數據輸出,無論是經由Write-Output,隱式輸出,或從另一個命令:

    • 不能防止尾隨換行符當輸出被髮送到控制檯。看到this GitHub issue -

    • 不幸的是,Windows PowerShell中V5.1/PowerShell核心V6.0.0,你無法通過管道發送文本外部程序時,爲防止尾隨換行符。

    • 在PSv5 +,但是,您可以防止尾隨的換行符文件捕獲輸出,通過使用Out-File -NoNewlineSet-Content -NoNewline(在PSv4-,必須直接使用.NET Framework) ;相反,重定向到>的文件確實附加了一個尾隨換行符。

      • 警告:如果您輸出多個對象,-NoNewline不僅抑制了尾隨換行,而且換行之間的這些對象。
      • 有關Out-FileSet-Content之間的差異以及何時選擇哪個,請參閱我的this answer