2010-06-16 11 views
6

Ich versuche, etwas sehr einfaches in PowerShell zu tun.PowerShell locking Datei

  1. den Inhalt einer Datei
  2. Manipulation Lesen einige Zeichenfolge
  3. den modifizierten Test zurück in die Datei zu speichern

    function Replace { 
        $file = Get-Content C:\Path\File.cs 
        $file | foreach {$_ -replace "document.getElementById", "$"} |out-file -filepath C:\Path\File.cs 
    } 
    

ich Set-Content auch versucht haben.

Ich bekomme immer eine nicht autorisierte Ausnahme. Ich kann sehen, $file hat den Dateiinhalt, Fehler kommt während des Schreibens der Datei.

Wie kann ich das beheben?

+0

Scheitert dies für alle Dateien oder nur diese oder in diesem Pfad? –

Antwort

4

Dies wird wahrscheinlich durch das Cmdlet Get-Content verursacht, das eine Sperre zum Lesen erhält, und Out-File versucht, seine Sperre zum Schreiben zu erhalten. Ähnliche Frage ist hier: Powershell: how do you read & write I/O within one pipeline?

So wäre die Lösung:

${C:\Path\File.cs} = ${C:\Path\File.cs} | foreach {$_ -replace "document.getElementById", '$'} 
${C:\Path\File.cs} = Get-Content C:\Path\File.cs | foreach {$_ -replace "document.getElementById", '$'} 

$content = Get-Content C:\Path\File.cs | foreach {$_ -replace "document.getElementById", '$'} 
$content | Set-Content C:\Path\File.cs 

Grundsätzlich müssen Sie den Inhalt der Datei Puffer, so dass die Datei (Get-Content zum Lesen) geschlossen werden kann, und dass, nachdem der Puffer sollte in die Datei geleert werden (Set-Content, während dieser Schreibsperre erforderlich sein wird).

+0

Es hat funktioniert. Vielen Dank. Jetzt fühle ich mich dumm, das zu fragen :) aber danke. Ich habe darüber gelesen, aber da ich alles in einer Aussage verrohrte gab es mir Fehler, da das Schloss nicht freigegeben wurde. Kühl !! – Ben

+0

Ich verstehe die Lösung nicht - Ich habe eine XML-Datei über '[XML] $ Datei = Get-Content $ Dateiname' und wenn ich versuche, die Datei nach dem Lesen zu löschen, bekomme ich den Sperrfehler. Es gibt keine dispose-Methode für das 'XmlDocument' und das Nullen von' $ file' funktioniert nicht, daher weiß ich nicht, wie ich vorgehen soll. – PeterX

+0

Vielleicht sollte die Variable 'xml' '[xml] $ xml = Get-Content $ filename' sein. Es ist also klar, dass es keine Datei, sondern ein Objekt ist, das xml darstellt. 'Remove-Item $ filename' löscht die Datei. – stej