2013-02-05 96 views
1

我有一個PowerShell腳本根據文件的各種條件設置標誌。爲簡潔起見,我將縮寫。爲什麼Powershell會寫入控制檯,但不寫入文件?

$path = "c:\path" 
$srcfiles = Get-ChildItem $path -filter *.htm* 

ForEach ($doc in $srcfiles) { 

$s = $doc.Fullname 

Write-Host "Processing :" $doc.FullName 

if (stuff) {flag 1 = 1} else {flag 1 = 0} 
if (stuff) {flag 1 = 1} else {flag 1 = 0} 
if (stuff) {flag 1 = 1} else {flag 1 = 0} 

$t = "$s;$flag1;$flag2;$flag2" 

Write-Host "Output: " $t 

這一切都很好。我的文件進程,標誌設置正確,以$ t生成一個整齊的分號分隔線。但是,如果我在該函數的末尾敲擊這兩行,則

$stream = [System.IO.StreamWriter] "flags.txt" 
$stream.WriteLine $t  

我收到此錯誤。

Unexpected token 't' in expression or statement. 
At C:\CGC003a.ps1:53 char:25 
+  $stream.WriteLine $t <<<< 
    + CategoryInfo   : ParserError: (t:String) [], ParseException 
    + FullyQualifiedErrorId : UnexpectedToken 

如果我讀這個寫,似乎write-host刷新我的變量$t纔到了WriteLine。然而,在我嘗試out-file之前,我想了解在Write-Host阻止Write Line將其視爲有效之後$t發生了什麼。還是有什麼我失蹤?

回答

6

嘗試:

$stream.WriteLine($t) 

的WriteLine是streamwriter .NET對象的方法。爲了傳遞價值,你需要把它們放在()

- 如果你需要追加到你需要這樣創建一個StreamWriter:

$a = new-object 'System.IO.StreamWriter' -ArgumentList "c:\path\to\flags.txt",$true 

在布爾邏輯參數可以是真實的數據追加到文件orfalse覆蓋文件。

我建議通過完整路徑:

$stream = [System.IO.StreamWriter] "c:\path\to\flags.txt" 

否則你在.NET中創建當前文件夾(文件可能爲C:\ Windows \ System32下,如果以管理員身份運行當前的PowerShell控制檯,知道它鍵入[System.IO.Directory]::GetCurrentDirectory()

+0

真棒!至少我得到了一個不同的錯誤...我的第一條記錄寫入文件,然後我得到運行時錯誤,它被另一個進程使用......這是有道理的。是否存在將覆蓋該文件鎖定的streamwriter方法的強制切換?它不喜歡'-append'。 – dwwilson66

+0

Um ... streamwriter對象在用於解鎖文件後需要被.closed()和最終.disposed()。如果您已經覆蓋$ stream變量,您需要關閉powershell並重新打開以解鎖文件。而不是在循環中運行你的stramwriter,在循環之前,並關閉它在你的腳本中 –

+0

是的,我瞭解'.closing'這個文件......但是它通過'foreach($ doc) ',我需要在每次迭代結束時關閉它嗎?我想我只需要在所有迭代結束時關閉文件......我錯過了什麼? – dwwilson66

0

你可以嘗試

$t > c:\path\to\flags.txt 
+0

儘管這種方式確實有效,但它比使用StreamWriter更低效(因此速度更慢) - 尤其是通過網絡/遠程連接。 ---見:http://blogs.technet.com/b/gbordier/archive/2009/05/05/powershell-and-writing-files-how-fast-can-you-write-to-a-file的.aspx – CJBS