2010-06-16 4 views
6

J'essaie de faire quelque chose de très simple dans PowerShell.Verrouillage PowerShell Fichier

  1. Lecture du contenu d'un fichier
  2. Manipulation ficelle
  3. Enregistrer le test modifié dans le fichier

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

J'ai essayé Set-Content aussi bien.

Je reçois toujours une exception non autorisée. Je peux voir le $file a le contenu du fichier, l'erreur arrive lors de l'écriture du fichier.

Comment puis-je résoudre ce problème?

+0

Est-ce que cela échoue pour tous les fichiers ou juste celui-là ou dans ce chemin? –

Répondre

4

Ceci est probablement dû à l'applet de commande Get-Content qui obtient un verrou pour la lecture et Out-File qui tente d'obtenir son verrou pour l'écriture. question similaire est ici: Powershell: how do you read & write I/O within one pipeline?

Donc, la solution serait:

${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 

Fondamentalement, vous devez tamponner le contenu du fichier afin que le fichier peut être fermé (Get-Content pour la lecture) et après que le tampon doit être vidée dans le fichier (Set-Content, pendant que le verrouillage en écriture sera nécessaire).

+0

Cela a fonctionné. Merci. Maintenant, je me sens stupide de demander cela :) mais merci. J'ai lu à ce sujet mais puisque je pipais tout dans une déclaration, il m'a donné une erreur car le verrou n'a pas été libéré. Cool !! – Ben

+0

Je ne comprends pas la solution - J'ai un fichier XML via '[xml] $ fichier = Get-Content $ filename' et quand je tente de supprimer le fichier après l'avoir lu, je reçois l'erreur de verrouillage. Il n'y a pas de méthode disponible sur 'XmlDocument' et annuler' $ file' ne fonctionne pas, donc je ne sais pas comment procéder. – PeterX

+0

La variable devrait être 'xml' [xml] $ xml = Get-Content $ filename'. Donc c'est clair, ce n'est pas un fichier, mais un objet qui représente xml. 'Remove-Item $ filename' supprime le fichier. – stej

Questions connexes