2013-01-12 16 views
6

Mam następujący kod w PowerShellplik IO, czy jest to błąd w 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") 
} 

Wciąż dostaję błąd:

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"."

Próbowałem odpowiednika w języku 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"); 
    } 

działa dobrze!

Co jest nie tak z moim skryptem PowerShell? BTW używam na PowerShell

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

Odpowiedz

16

Innym sposobem byłoby używać tylko nazwy wartości i niech PowerShell oddanych do typu docelowego:

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

Tak, to jest podejście, które również brał. –

0

Jeśli twoim celem jest, aby napisać do pliku logfile lub tekstowego, a następnie można spróbować obsługiwane cmdlets PowerShell do osiągnięcia tego celu?

Get-Help Out-File -Detailed 
4

Podczas korzystania z New-Object komandletu i typ docelowy konstruktor pobiera parametrów, należy użyć parametru -ArgumentList (New-Object) lub owinąć parametry w nawiasach - Wolę owinąć konstruktorów z parens:

# 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() 

New-Object cmdlet pomoc: http://go.microsoft.com/fwlink/?LinkID=113355

+0

Można równie dobrze opuścić parens, ponieważ to właśnie spodziewa tablicę obiektów, ewentualnie poprzedzony '-ArgumentList'. Twoje parens po prostu sprawiają, że jest to osobne wyrażenie; czy to jest poprawne? – mousio

+3

Parens wokół tablicy w PowerShell jest efektywnie no-op, z wyjątkiem działania jako separator znaczników. Unikam tej składni 'nowego obiektu (arg, arg, ...)' ponieważ wprowadza cię to w błąd, ponieważ jest to po prostu konstruktor C#, kiedy tak naprawdę nie jest. W rzeczywistości mniej pisze się używając "nowego obiektu arg, arg, ...". Przepraszamy za bycie pedantem, ale odpowiedziałem na zbyt wiele pytań o to, dlaczego 'MyPowerShellFunctionThatTakesThreeParameters (1,2,3)' nie działa. :-) –

2

Jeszcze innym sposobem może być załączenie stałe teksty w parens:

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