2013-01-12 6 views
6

私はPowerShellのファイル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でサポートされるコマンドレットを試みることができるのPowerShell

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

答えて

16

もう一つの方法は、値の名前だけを使用し、PowerShellがターゲット・タイプにキャストできるようになります:

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

うん、それも私が取るだろうアプローチです。 –

0

上で実行されているのですか?

Get-Help Out-File -Detailed 
4

New-Objectコマンドレットを使用して、ターゲット・タイプコンストラクタはパラメータに取るとき、あなたは(新-Objectの)-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() 

新-Objectコマンドレットのオンラインヘルプ:http://go.microsoft.com/fwlink/?LinkID=113355

+0

それだけで、必要に応じて-ArgumentList' 'が先行オブジェクト配列を、期待するので、あなたは同様にうまく、括弧を省略することができます。あなたの括弧はそれを別の表現にするだけです。あれは正しいですか? – mousio

+3

PowerShellの配列を囲む括弧は、実質的にはトークンセパレータとして動作する以外は何もしません。私はこの構文を 'new-object (arg、arg、...)'と呼んでいません。なぜなら、実際にはそうでないときに、これが単なるC#コンストラクタであると誤解するからです。実際には、 'new-object arg、arg、...'を使うのはそれほど厳密ではありません。申し訳ありませんが、私はなぜ 'MyPowerShellFunctionThatTakesThreeParameters(1,2,3)'がうまくいかないのかについて、あまりにも多くの質問に答えました。 :-) –

2

さらにもう1つの方法は、括弧内の列挙型を囲むことができます

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