2015-02-27 1 views
0

Je crée un script pour publier des applications Web avec PowerShell.Fermeture d'un fichier XML après l'avoir lu avec Powershell

Depuis que je suis au début du développement, je modifie le script et le fichier xml en alternance. À l'heure actuelle, le script est assez petit et simple:

$settings = [xml](Get-Content c:\PublishData.xml) 
$whereToProjectsAreLocally = $settings.publishing.globals.localprojectdir 

Mais j'ai un problème. Une fois que j'ai lancé le script et vérifié que tout fonctionne comme prévu, je vois qu'il est impossible d'éditer le fichier xml (via Notepad ++). Je reçois un message d'erreur indiquant que l'enregistrement a échoué et que je devrais vérifier si le fichier est utilisé par une autre application.

Aucune autre application hormis Notepad ++ et Powershell ISE n'utilise le fichier.

Fermeture de l'ISE ne résout pas le problème (fermeture de l'ISE chaque fois que je lance le script n'est pas ma solution de rêve non plus).

La fermeture du Bloc-notes ++ ne résout pas non plus le problème (bien que la dernière version se souvienne des changements même si je ne les sauvegarde pas, mais ce n'est pas non plus la solution).

Je suppose qu'il y a quelque chose comme un XmlReader en arrière-plan que je n'ai pas fermé. Ma question est: comment puis-je la fermer après avoir lu le contenu du fichier XML?

EDIT: Le même script fonctionne correctement si le fichier XML n'est pas stocké sur C: \ mais dans un répertoire inférieur. Comment puis-je le faire fonctionner dans le répertoire racine C: \?

+1

Cela ne se produit pas pour moi sur mon powershell v4, il y a une bonne chance que c'est être causé par autre chose. – VoidStar

+1

Utilisez le [Handle] de Sysinternals (https://technet.microsoft.com/en-us/sysinternals/bb896655.aspx) pour vérifier quel processus verrouille le fichier XML. – vonPryz

+0

./Handle.exe C: \ PublishData.xml dit "Aucun descripteurs correspondants trouvés." –

Répondre

1

Essayez ceci:

$xmlFile = 'c:\PublishData.xml' 
$rawXML = Get-Content $xmlFile -Raw 
$settings = [XML]$rawXML 

Edit: Est-ce que la pensée, cela peut être une autre option:

$settings = [xml]([System.IO.File]::ReadAllLines($xmlFile))