2011-08-17 88 views
8

有在PowerShell將輸出一個簡單的方法一個字符串變量和控制檯,同時輸出一個字符串變量和控制檯?如何在同一時間

我想我的腳本的輸出捕獲到一個變量,所以我可以分析它在腳本的末尾,將其保存到一個日誌文件,並通過電子郵件發送給操作員。

我的目的是爲了有一個變量$輸出,並添加任何輸出字符串,並也輸出到控制檯立即像

$output="Process started" 

$output=+"Doing step 1" 
"Doing step 1" 

$output=+"Doing step 2" 
"Doing step 2" 

所以最後我可以節省$輸出到一個日誌文件,電子郵件它並解析它。

我打了三通對象可能的工作,爲此目的但不幸的是它會重寫我的$輸出變量,而不是追加一個字符串,它的。

UPDATE 這是我決定與之合作的最終解決方案 - 感謝manojlds!

$script:output = "" 

filter mylog { 
    $script:output+= $_+"`n" 
    return $_ 
} 


"doing step {0}" -f 1 | mylog 
"doing step {0}" -f 2 | mylog 
"doing step {0}" -f 3 | mylog 

#in the end of the script 
$script:output 

回答

5

有這麼多的方式來獲得你的最終目標:

在你的腳本只是有這樣的事情:

"Process started" 
<step1> 
"Doing step 1" 
<step2> 
"Doing step 2" 
... 

然後運行該腳本

.\test.ps1 | Tee-Object -file log.txt 

請注意,輸出是可用的e到Tee-Object,並因此控制檯出現時。只有在整個腳本運行後才能得到輸出。這是管道在Powershell中的工作方式。對象在發生時隨着下游傳遞。在步驟之間插入一個sleep 10,並查看輸出在可用時立即生效。

而且,你不一定要有另一個腳本(該launcher.ps1)你正在談論。你可以在腳本中使用函數,腳本等。

一些其他的方法:

function test { 

"Process started" 
sleep 5 
"Doing step 1" 
sleep 5 
"Doing step 2" 

} 

test | %{$output+=$_;$_} 
#use output 
write-host -fore blue $output 

您可以創建一個過濾器:

$script:output = "" 

filter appendOutput { 

    $script:output+= $_ 
    return $_ 
} 

"Process started" | appendOutput 
sleep 5 
"Doing step 1" | appendOutput 
sleep 5 
"Doing step 2" | appendOutput 
#use output 
write-host -fore blue $script:output 

可能有這樣做的更多的方式。

+0

這是我如何實現這個第一,但結束了兩個腳本。我現在有更復雜的腳本,需要在調用腳本中進行一些分析,這使我的調用腳本變得複雜。我剛剛發現這篇文章http://get-powershell.com/post/2008/06/26/Stuffing-the-output-of-the-last-command-into-an-automatic-variable.aspx,我在想現在如果我可以做那種壓倒性的默認 – mishkin

+0

對不起,只是爲了讓自己清楚...我有我的主腳本(讓我們說main.ps)和launcher.ps(類似於你的。\ test.ps1 | Tee- Object -file log.txt),所以啓動器將捕獲主腳本的輸出。雖然它的工作原理,我有這樣的兩個問題 - 我沒有看到任何東西,直到我的主腳本完成,我不能做任何分析/解析我的主要腳本 – mishkin

+0

@mishking - '。\ test.ps1 | Tee-Object -file log.txt' - 如果你這樣做了,你會在控制檯中看到輸出的結果。在上述腳本的字符串之間添加一個「睡眠10」,然後看看。另請參閱我的更新回答 – manojlds

-1
("Process started" | out-host) | Set-Variable x ; $x 
+0

謝謝,但它不起作用 - $ x將每次重置,而我需要它來積累所有腳本輸出 – mishkin

+0

-1。這甚至不起作用! '$ x'將是空的,因爲'out-host'已經得到了字符串,你會得到它的輸出給set-variable,這是什麼(寫入主機並不意味着它可以在管道中使用)。 – manojlds

1

我還沒有使用PowerShell足以給一個具體的答案亂,但如果我是做這在C我會利用副作用。

//Psuedo-C 
string con (oldString, newString) { 
    print(newString); 
    return oldString + newString; 
} 

像這樣使用功能:

myString = con(myString, "Process started"); 

它會收到預期的效果。 (拋開正確的C語法和諸如處理換行符等習慣)我不知道如何將其轉換爲PowerShell。

你想要做什麼,可以考慮但凌亂。如果您只是明確地輸出並記錄輸出並在您的代碼中依次記錄,則可能會更清楚。副作用不可避免地會回來咬你。保持模塊化。

5

這是一個不錯的訣竅,將括號中的變量賦值包含在內。你可以找到更多關於這方面的PowerShell的語言規範(7.1.1節編組括號)可供下載here

PS > ($var=1) 
1 
PS > 
+0

真棒!這是一個非常酷的訣竅,並感謝那裏有很多好的信息。這個技巧對我來說不會有太大幫助,因爲如果我需要在一個var中累加輸出,如: $ output =「」 ($ output + =「doing step {0}」-f 1) ( $輸出+ =「做步驟{0}」 -f 2) 和我將獲得: 做步驟1 做步驟1doing步驟2 我將與過濾器粘現在像manojlds上面所建議的。 – mishkin

1

我一直在尋找與此類似,唯獨我沒有必要去分析它之後,只收集輸出。

東西別人會看,因爲它似乎你有你的答案被使用PowerShell成績單(啓動成績單和Stop-成績單)。我從這個site,它確實有一些問題,當你打一個服務器發現錯誤,但他展示了他如何處理它。

+0

謝謝!它可能適用於某些人,並且我也研究了這一點,但它具有如下所述的限制:http://blogs.msdn.com/b/powershell/archive/2010/01/04/workaround-for-start-成績單上,本機processes.aspx – mishkin