2016-04-04 4 views
0

У меня есть web.config с строкой соединения с сущностью.msdeploy и regex заменить значение строки подключения

То есть образец такой строки:

<add name="MyEntities" connectionString="metadata=res://*/GeneratedModel.MyModel.csdl|res://*/GeneratedModel.MyModel.ssdl|res://*/GeneratedModel.MyModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.\SQLEXPRESS;initial catalog=CRAP;persist security info=True;user id=MyUser;password=password;multipleactiveresultsets=True;application name=EntityFramework&quot;" providerName="System.Data.EntityClient" /> 

Я хочу заменить Initial Catalog ака имя базы данных «дерьмом» с новым именем «TEST»

Этот код должен работать так, как раньше работал с другой командой msdeploy.exe.

я просто должен был реструктурировать переменная $ MSD ...

$newActiveTargetDbName = 'TEST'; 

$msd = "C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" 
$iisPath = "MyWebSite/MyService,wmsvc='MyMachine:MyPort/msdeploy.axd',userName='username',password='password'" 
& $msd -verb=sync -allowUntrusted -dest=contentPath="$iisPath" -source=contentPath="$iisPath" -setParam=kind="TextFile,match=""(MyEntities.*?catalog=).*?(;)"",scope=web.config$,value=`$1$newActiveTargetDbName`$2" 

Когда я запускаю выше заявление, я получаю эту строку подключения в файле web.config:

<add name="$1TEST$2persist security info=True;user id=MyUser;password=password;multipleactiveresultsets=True;application name=EntityFramework&quot;" providerName="System.Data.EntityClient" /> 

It мне кажется, что мне нужны какие-то одиночные/двойные кавычки и т. д. ... но я пробовал на самом деле всевозможные комбинации и сводил меня с ума.

Как это исправить?

UPDATE

Это синтаксис оператора MSDeploy как РАБОТАЛ, прежде чем я изменил его!

$iisServicePath = 'MyWebsite/MyService'; 
$iisPath = "$iisServicePath,computerName=%TargetComputerName%,userName=%NTUserName%,password=%NTUserPassword%" 

& "C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" ` 
"-source=contentPath=$iisPath" ` 
'-verb=sync' ` 
'-verbose' ` 
'-allowUntrusted' ` 
"-dest=contentPath=$iisPath" ` 
"-setParam=kind=TextFile,match=""(MyEntities.*?catalog=).*?(;)"",scope=web.config$,value=`$1$newActiveTargetDbName`$2"; 

ответ

0

Я не знаком с msdeploy.exe, но я, кажется, некоторые ошибки ...

According to the docs, вы должны использовать двоеточие (:) после первоначального имени параметра; таких как: -dest:contentPath вместо -dest=contentPath.

Кроме того (помните, это домыслы, потому что я не знаком с msdeploy.exe):

  1. Вы пропустили двойные кавычки после TextFile.
  2. У вас не должно быть двойных двойных кавычек вокруг вашего значения match.
  3. Я не уверен, что вы хотите $ после web.config, но я оставлю его в покое, так как он, кажется, нашел ваш файл.

Я думаю, что ты нужна последняя строка, чтобы выглядеть примерно так:

& $msd -verb=sync -allowUntrusted -dest:contentPath="$iisPath" -source:contentPath="$iisPath" -setParam:kind="TextFile",match="(MyEntities.*?catalog=).*?(;)",scope=web.config$,value="`$1$newActiveTargetDbName`$2" 

Я надеюсь, что это помогает!

Update

Основываясь на ваш рабочий один, который я сомневаюсь работает, так как он использует % имена переменных (не как POSH делает вещи), это должно делать то, что вы хотите:

& $msd -verb=sync -allowUntrusted -dest=contentPath="$iisPath" -source=contentPath="$iisPath" -setParam=kind=TextFile,match="(MyEntities.*?catalog=).*?(;)",scope=web.config$,value="`$1$newActiveTargetDbName`$2" 

Примечание:есть также несколько неотвеченных переменных; если вы дадите нам полный код, то есть много ошибок.

Update 2

Просмотрев все снова (с небольшим количеством обратной связи с OP), это, как я хотел бы сделать это в PowerShell. Я не 100% уверен, что ваши аргументы верны:

#region Set These Variables 
$computername = $env:ComputerName 
$nt_username = 'username' 
$nt_password = 'password' 
$newActiveTargetDbName = 'newActiveTargetDbName' 
#endregion 

$msd = "C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" 
$iisServicePath = 'MyWebsite/MyService' 
$iisPath = "${iisServicePath},computerName=${computername},userName=${nt_username},password=${nt_password}" 

$start_process = @{ 
    'FilePath' = $msd; 
    'ArgumentList' = @(
     '-verb=sync', 
     '-allowUntrusted', 
     "-dest=contentPath=""${iisPath}""", 
     "-source=contentPath=""${iisPath}""", 
     "-setParam=kind=""TextFile,match='(MyEntities.*?catalog=).*?(;)',scope=web.config$,value=`$1${newActiveTargetDbName}`$2""" 
    ); 
    'Wait' = $True 
} 

$process = Start-Process @start_process 

Это даст вам команду, которая будет выглядеть следующим образом в командной строке:

"C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" -verb=sync -allowUntrusted -dest=contentPath="MyWebsite/MyService,computerName=V-ASUSM32,userName=username,password=password" -source=contentPath="MyWebsite/MyService,computerName=V-ASUSM32,userName=username,password=password" -setParam=kind="TextFile,match='(MyEntities.*?catalog=).*?(;)',scope=web.config$,value=$1newActiveTargetDbName$2" 

Примечание: В setParam аргументу , Я изменил match на одинарные кавычки, потому что он выглядел так, как будто он собирался испортить ваши двойные кавычки около kind. Если msdeploy.exe не нравится одиночные кавычки, нам нужна фактическая рабочая команда CMD, чтобы выяснить, что происходит.

+0

Я обновил свой вопрос с помощью прежнего рабочего образца. Там вы видите, что -dest = contentPath полностью в порядке. Мне понравилось ваше окончательное предложение линии и получить эту ошибку: msdeploy.exe: Ошибка: непризнанный аргумент 'match = (ErpProductsEntities. *? Catalog =). *? (;)'. Все аргументы должны начинаться с «-». – Elisabeth

+0

Ваш многострочный образец генерирует исключения/ошибки. Я знаю, что вы сказали, что не знакомы с msdeploy, но вы действительно должны попробовать свой образец в PS IDE, иначе люди думают, что образец может работать или быть решением :-) – Elisabeth

+0

@Elisabeth, вы попробовали пример с одной строкой? У меня была заметка после многострочного примера: *** Примечание: *** * этот преднамеренно не правильный шикарный многострочный синтаксис, потому что я не хочу, чтобы back-ticks (') нарушали подсветку синтаксиса. * – VertigoRay