我想從日誌文件中收集腳本中的所有輸出,並且必須使用寫主機的寫輸出instaed。在寫輸出中避免換行
Write-Output "Server:" $a
看起來像
Server:
。
foo
我真的有寫來寫
write-output $("sfdghk:" + $a)
得到Server:Foo
感謝 -jt
我想從日誌文件中收集腳本中的所有輸出,並且必須使用寫主機的寫輸出instaed。在寫輸出中避免換行
Write-Output "Server:" $a
看起來像
Server:
。
foo
我真的有寫來寫
write-output $("sfdghk:" + $a)
得到Server:Foo
感謝 -jt
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
顯然這裏是一個抽象,但我希望它能讓你理解。
在互聯網上發現某處:
Write-Output "Server: $($a)"
在我的代碼的偉大工程。
對於這個例子,'$(...)'結構是多餘的,因爲它表示將括號內的所有內容視爲腳本而不是文本。由於'$ a'已經被解釋並插入到帶引號的字符串中,所以不需要添加包裝。 '寫輸出「服務器:$ a」' ...將正常工作。 當您嘗試訪問變量的方法或屬性時,使用包裝器$()。 '$ a =「我喜歡雞蛋。」 寫輸出「字符計數:$($ a.length)」'會打印出'我喜歡eggs..length'而沒有'$(...)'包裝器。 – HipCzeck 2015-01-15 17:19:13
謝謝你,你救了我一天!我認爲這是powershell的設計問題,它不應該讓方式如此不同於另一個腳本語言。 – ariso 2017-04-20 16:10:19
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
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
有在現有的答案良好的信息,但讓我試圖以務實的總結:
當打印到控制檯或重定向到一個文件,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 -NoNewline
或Set-Content -NoNewline
(在PSv4-,必須直接使用.NET Framework) ;相反,重定向到>
的文件確實附加了一個尾隨換行符。
-NoNewline
不僅抑制了尾隨換行,而且換行之間的這些對象。Out-File
和Set-Content
之間的差異以及何時選擇哪個,請參閱我的this answer。
'寫輸出 「服務器:$ A」' – 2011-05-27 22:30:28
@empo:您應該提交這作爲一個答案。在我看來,它比迄今爲止唯一的答案更直接和相關。 – 2011-05-27 23:54:33