web-dev-qa-db-fra.com

L'enregistrement d'un fichier XML dans powershell nécessite un chemin complet. Pourquoi?

J'utilise les capacités XML de PowerShell pour modifier un fichier .config. Appel XMLDocument.Save n'a aucun effet, sauf si je fournis le nom complet du chemin.

# Open the xml file
$config = [xml](get-content web.config)
#
# modify the XML
$config.SelectNodes("./configuration/connectionStrings/add[@name='LocalSqlServer']") | % { $connNode = $_ }
$connNode.connectionString = $connNode.connectionString -replace '^(.*)Server=[^;]+(.*)$', '$1Server=192.168.5.2$2'
#
#
# Now I save it again
#
# This doesn't save it!
$config.Save("web.config");
# However, this works
$config.Save("{0}\\web.config" -f (get-location));

Pourquoi $ config.Save ("web.config") ne fonctionne-t-il pas?

Ai-je fini par l'enregistrer ailleurs, autre que mon annuaire local?

46
Andrew Shepherd

La raison en est que le répertoire de travail actuel dans PowerShell n'est pas nécessairement le même que le répertoire de travail du processus.

En effet, la direction de travail PowerShell (Get-Location) peut utiliser les différents fournisseurs de système de fichiers - tels que le registre ou les certificats. De plus, parce que powershell peut avoir plusieurs espaces d'exécution, chacun peut avoir son propre répertoire de travail actuel.

Il existe deux solutions à cela.

L'une consiste à utiliser Resolve-Path(Resolve-Path "orders.xml"), bien que cela vérifie l'existence avant de renvoyer la valeur, donc pour la création de nouveaux fichiers, cela peut être un problème. L'autre option consiste à utiliser l'alias de get-location: $pwd par exemple ("$pwd\orders.xml")

Donc, pour votre exemple, vous pouvez soit modifier la ligne 2 pour être

$config = [xml](get-content (Resolve-Path "web.config"))

ou

$config = [xml](get-content "$pwd\web.config")

et respectivement la ligne 12

$config.Save((Resolve-Path "web.config"));

ou

$config.Save("$pwd\web.config");
64
James

S'il ne se rendait pas dans le répertoire de travail actuel, je vérifierais $ home.

25
mjolinor