2013-01-12 22 views
6

我有下面的代碼在PowerShell中file IO,這是Powershell中的一個錯誤嗎?

$filePath = "C:\my\programming\Powershell\output.test.txt" 

try 
{ 
    $wStream = new-object IO.FileStream $filePath, [System.IO.FileMode]::Append, [IO.FileAccess]::Write, [IO.FileShare]::Read 

    $sWriter = New-Object System.IO.StreamWriter $wStream 

    $sWriter.writeLine("test") 
} 

我不斷收到錯誤:

Cannot convert argument "1", with value: "[IO.FileMode]::Append", for "FileStream" to type "System.IO.FileMode": "Cannot convert value "[IO.FileMode]::Append" to type "System.IO.FileMode" due to invalid enumeration values. Specify one of the following enumeration values and try again. The possible enumeration values are "CreateNew, Create, Open, OpenOrCreate, Truncate, Append"."

我試着在C#中的等價物,

FileStream fStream = null; 
    StreamWriter stWriter = null; 

    try 
    { 
     fStream = new FileStream(@"C:\my\programming\Powershell\output.txt", FileMode.Append, FileAccess.Write, FileShare.Read); 
     stWriter = new StreamWriter(fStream); 
     stWriter.WriteLine("hahha"); 
    } 

它工作正常!

我的powershell腳本有什麼問題?順便說一句,我在PowerShell中

Major Minor Build Revision 
----- ----- ----- -------- 
3  2  0  2237 

回答

16

另一種方法是使用值的只是名字,並讓PowerShell的將它轉換爲目標類型:

New-Object IO.FileStream $filePath ,'Append','Write','Read' 
+0

是的,這也是我採取的方法。 –

0

運行如果你的目標是要寫入日誌文件或文本文件,那麼你可以嘗試在PowerShell中的支持cmdlet來實現這一目標?

Get-Help Out-File -Detailed 
4

當使用New-Object cmdlet和目標類型構造函數接受的參數,您應該使用-ArgumentList參數(新對象),或在括號包裹參數 - 我更願意換我的構造方法的括號:

# setup some convenience variables to keep each line shorter 
$path = [System.IO.Path]::Combine($Env:TEMP,"Temp.txt") 
$mode = [System.IO.FileMode]::Append 
$access = [System.IO.FileAccess]::Write 
$sharing = [IO.FileShare]::Read 

# create the FileStream and StreamWriter objects 
$fs = New-Object IO.FileStream($path, $mode, $access, $sharing) 
$sw = New-Object System.IO.StreamWriter($fs) 

# write something and remember to call to Dispose to clean up the resources 
$sw.WriteLine("Hello, PowerShell!") 
$sw.Dispose() 
$fs.Dispose() 

新對象cmdlet在線幫助:http://go.microsoft.com/fwlink/?LinkID=113355

+0

您同樣可以很好離開了括號,因爲它只是期待一個對象數組,任選被'-ArgumentList'之前。你的parens只是使它成爲一個單獨的表達;那是對的嗎? – mousio

+3

Parents圍繞PowerShell中的數組實際上是空操作,除非充當令牌分隔符。我避免使用'new-object (arg,arg,...)'這個語法,因爲它誤導了你相信這只是一個C#構造函數,實際上它不是。實際上,使用'new-object arg,arg,...'的輸入更少。對於迂腐,但我已經回答了很多關於爲什麼MyPowerShellFunctionThatTreeThreeParameters(1,2,3)'不起作用的問題。 :-) –

2

另一種方式可以是封閉的枚舉的括號:

$wStream = new-object IO.FileStream $filePath, ([System.IO.FileMode]::Append), ` 
    ([IO.FileAccess]::Write), ([IO.FileShare]::Read)