2011-01-27 10 views
35

Estoy usando las capacidades XML de powershell para modificar un archivo .config. Llamar a XMLDocument.Save no tiene ningún efecto, a menos que proporcione el nombre de ruta completo.Guardar un archivo XML en powershell requiere una ruta completa. ¿Por qué?

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

¿Por qué no funciona $ config.Save ("web.config")?

¿Terminé guardándolo en otro lugar, que no sea mi directorio local?

+0

¿Qué punto $ hogar? Debe estar allí –

+0

cualquier solución con código fuente completo al respecto? – Kiquenet

Respuesta

47

La razón es porque el directorio de trabajo actual en powershell no es necesariamente el mismo que el directorio de trabajo del proceso.

Esto se debe a que la dirección de trabajo de powershell (Get-Location) puede hacer uso de los diferentes proveedores del sistema de archivos, como el Registro o los Certificados. Además, debido a que powershell puede tener múltiples espacios de ejecución, cada uno puede tener su propio directorio de trabajo actual.

Existen dos soluciones para esto.

Una es usar Resolve-Path(Resolve-Path "orders.xml"), aunque esto comprobará la existencia antes de devolver el valor, por lo que para la creación de archivos nuevos, esto puede ser un problema. La otra opción es utilizar el alias de ubicación get-: $pwd por ejemplo ("$pwd\orders.xml")

Así que para su ejemplo, usted podría o cambio de la línea 2 para ser

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

o

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

y respectivly línea 12 para ser

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

o

$config.Save("$pwd\web.config"); 
+1

¡Usted, señor, me salvó el día! Por como 3 pequeñas cosas que quería hacer. –

22

Si no fuera al directorio de trabajo actual, marcaría $ home.

+2

Y ahí es donde estaba. :-) –

+9

Set-Location (también conocido como cd) en PowerShell no cambia el directorio actual maintined por el sistema operativo, por lo que el directorio actual normalmente permanece donde estaba cuando inició PowerShell. Si desea cambiar el directorio actual, puede establecer la propiedad [Environment] :: CurrentDirectory. – OldFart

Cuestiones relacionadas