Заменить строку подключения к базе данных с помощью PowerShell - PullRequest
1 голос
/ 09 мая 2020

Я работаю над сценарием, который должен отображать текущую базу данных, к которой подключена программа, а также давать возможность заменить ее новой базой данных (либо вручную, вводя имя базы данных, но предпочтительно перечисляя все базы данных на локальном сервере \ экземпляра и предоставьте пользователям «выбор номера» для выбора базы данных, которую они хотят использовать.

Строка подключения сохраняется в текстовом файле с именем server.exe. config ниже является примером того, что файл содержит, а не единственные данные в файле конфигурации, очевидно,

<add key="persistency.connection" value="data source=MyDatabaseServer;initial catalog=MyDatabase1;Integrated Security=True" />

Я могу использовать Get-Content, чтобы увидеть весь файл, а также Where-Object {$_ -like "*initial catalog=*"}, чтобы увидеть единственную строку, которая имеет конфигурацию базы данных.

Но я думаю, что пользователям будет сложно понять, какая база данных используется, поэтому, если возможно, потребуется команда, которая будет отображать только имя базы данных, которое находится в файле конфигурации, а не всю строку, сохраните это имя базы данных для будущей замены, когда пользователь выбирает новую базу данных для замены в conf ig файл.

Возможно?

Ответы [ 2 ]

1 голос
/ 09 мая 2020
$file = './server.exe.config'

# Extract the XML element of interest, using an XPath query
$xpathQuery = '/configuration/appSettings/add[@key = "persistency.connection"]'
$el = (Select-Xml $xpathQuery $file).Node

# Get the current db name, if needed (not needed if you
# simply want to set a new name).
$db = $el.value -replace '.*\binitial catalog=([^;]+).*', '$1'

# Replace the db name...
$newDatabase = 'NewDatabase'
$el.value = $el.value -replace '(?<=\binitial catalog=)[^;]+', $newDatabase

# ... and save the modified document back to the file.
# Encoding note: This creates a BOM-less UTF-8 file in PowerShell [Core] 6+,
#                and an ANSI file in Windows PowerShell; use -Encoding if needed.
Set-Content $file -Value $el.OwnerDocument.OuterXml
0 голосов
/ 09 мая 2020

Я думаю, что это проще и работает для меня

$ConnString = Get-Content -Path $filepath\server.exe.Config | Where-Object {$_ -like "*initial catalog=*"}
$ConnString -split '\s*;\s*' | ForEach-Object -Process {
    if ($_ -imatch '^initial catalog=(?<dbname>.+)$') {
        $ConnStringdb = $Matches.dbname
    }
}

Затем я использую следующее, просто чтобы заменить текст выше обратно в файл конфигурации после ввода имени базы данных - вручную. был бы рад, если бы я мог заставить его работать автоматически, возможно, построив массив или что-то в этом роде.

Write-Host "Please Enter the database name you want to use for Production(Don't Leave Blank): "  -NoNewline; $NewDatabaseConfig = Read-Host;
(Get-Content -Path $filepath\server.exe.Config -Raw) -Replace $ConnStringdb,$NewDatabaseConfig | Set-Content -Path $IPSServerProd\UBERbaseOfficeServer.exe.Config
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...