powershell - PowerShell - 自动替换配置文件的条目
问题描述
.
大家好,
由于我编写了一个脚本来使用 PowerShell 自动安装 Microsoft SQL Server,我还必须替换配置文件中的一些参数。配置文件如下所示:
IACCEPTSQLSERVERLICENSETERMS="True"
IACCEPTPYTHONLICENSETERMS="True"
ACTION="Install"
SUPPRESSPRIVACYSTATEMENTNOTICE="True"
IACCEPTROPENLICENSETERMS="True"
PID="11111-00000-00000-00000-00000"
MRCACHEDIRECTORY="C:\Software\Offline Packages"
ENU="True"
QUIET="True"
QUIETSIMPLE="False"
UpdateEnabled="False"
USEMICROSOFTUPDATE="False"
UpdateSource="MU"
FEATURES=SQLENGINE,REPLICATION,ADVANCEDANALYTICS,SQL_INST_MR,SQL_INST_MPY,FULLTEXT,CONN,BC,SDK,SNAC_SDK,LOCALDB
HELP="False"
INDICATEPROGRESS="False"
X86="False"
INSTANCENAME="SQLNEU"
INSTALLSHAREDDIR="C:\Program Files\Microsoft SQL Server"
INSTALLSHAREDWOWDIR="C:\Program Files (x86)\Microsoft SQL Server"
INSTANCEID="SQLEXPRESS"
SQLUSERDBDIR="C:\DB\Databases"
SQLUSERDBLOGDIR="C:\DB\Logs"
SQLTELSVCACCT="NT Service\SQLTELEMETRY$SQLEXPRESS"
SQLTELSVCSTARTUPTYPE="Automatic"
INSTANCEDIR="C:\Program Files\Microsoft SQL Server"
AGTSVCACCOUNT="NT AUTHORITY\NETWORK SERVICE"
AGTSVCSTARTUPTYPE="Disabled"
COMMFABRICPORT="0"
COMMFABRICNETWORKLEVEL="0"
COMMFABRICENCRYPTION="0"
MATRIXCMBRICKCOMMPORT="0"
SQLSVCSTARTUPTYPE="Automatic"
FILESTREAMLEVEL="0"
ENABLERANU="True"
SQLCOLLATION="SQL_Latin1_General_CP1_CI_AS"
SQLSVCACCOUNT="NT Service\MSSQL$SQLEXPRESS"
SQLSVCINSTANTFILEINIT="True"
SQLSYSADMINACCOUNTS="IMWST01\Administrator" "AVENGERS\Tony.Stark"
SECURITYMODE="SQL"
SAPWD="Test1234!"
SQLTEMPDBFILECOUNT="1"
SQLTEMPDBFILESIZE="200"
SQLTEMPDBFILEGROWTH="64"
SQLTEMPDBLOGFILESIZE="8"
SQLTEMPDBLOGFILEGROWTH="64"
ADDCURRENTUSERASSQLADMIN="False"
TCPENABLED="1"
NPENABLED="0"
BROWSERSVCSTARTUPTYPE="Disabled"
EXTSVCACCOUNT="NT Service\MSSQLLaunchpad$SQLEXPRESS"
FTSVCACCOUNT="NT Service\MSSQLFDLauncher$SQLEXPRESS"
因此,我编写了以下行来接收配置条目并将其替换为哈希值:
$SQL_Server_Files_DB = "C:\DBTest\Databases"
$SQL_Server_Files_Logs = "C:\TestDB\Logs"
$SQL_Config = "C:\Scripts\SQLConfig.ini"
$SQL_Server_Config_Parameters = @{
"IACCEPTSQLSERVERLICENSETERMS" = "TESTNEU";
"IACCEPTPYTHONLICENSETERMS" = "Cool" ;
"SUPPRESSPRIVACYSTATEMENTNOTIC" = "True" ;
"IACCEPTROPENLICENSETERMS" = "True" ;
"MRECACHEDIRECTORY" = "$SQL_Server_Software_Basic\$SQL_Server_Software_Directory\Offline Packages";
"SQLUSERDBDIR" = $SQL_Server_Files_DB;
"SQLUSERDBLOGDIR" = $SQL_Server_Files_Logs;
"PID" = "11111-00000-00000-00000-00000";
"ENU" = "True";
"QUET" = "True";
"X86" = "False";
"INSTANCENAME" = "SQLNEU"
"INSTANCEID" = "SQLEXPRESS"
"SECURITYMODE" = "SQL"
"SAPWD" = "Test1234!"
}
Copy-Item -Path $SQL_Config -Destination $SQL_Config_TMP -Force
Get-Content -path C:\Scripts\SQLConfig.ini |
foreach-object -begin { $Server_Config = @{ } } -process {
$Config_Entries = [regex]::split( $_ , '=' );
$Config_Entries = $Config_Entries -replace '["''"]'
$Config_Entries_Parameter = $Config_Entries[ 0 ]
$Config_Entries_Value = $Config_Entries[ 1 ]
if( ( $Config_Entries_Parameter.CompareTo( "" ) -ne 0 ) -and ( $Config_Entries_Parameter.StartsWith( "[" ) -ne $True ) )
{
if( $SQL_Server_Config_Parameters.Contains( $Config_Entries_Parameter ) )
{
if( !( $SQL_Server_Config_Parameters[ $Config_Entries_Parameter ] -eq $Config_Entries_Value ) )
{
Write-Host "The Detected Value Of The SQL Config Parameter '$Config_Entries_Parameter' Differs From The User - Defined Value ! [ $Config_Entries_Value ]"
$neu = $( $SQL_Server_Config_Parameters[ $Config_Entries_Parameter ] )
$SQL_Config_Entries_Standard = $Config_Entries_Parameter + "=" + '"' + $Config_Entries_Value + '"'
$SQL_Config_Entries_User_Defined = $( $Config_Entries_Parameter ) + "=" + '"' + $( $neu ) + '"'
Write-Host "OLD : " $SQL_Config_Entries_Standard
Write-Host "NEW : " $SQL_Config_Entries_User_Defined
Write-Host "Changing Value Of The SQL Config Parameter '$Config_Entries_Parameter' To The User - Defined Value ! [ $( $SQL_Server_Config_Parameters[ $Config_Entries_Parameter ] ) ]"
$SQL_Config_TMP = "C:\Temp\SQL_Config_Standard.ini"
$test = ( Get-Content -Path $SQL_Config_TMP ) -replace $SQL_Config_Entries_Standard , $( $SQL_Server_Config_Parameters[ $Config_Entries_Parameter ] )
$test | Set-Content -Path 'C:\Temp\SQL_Config_Standard.ini' -Force
}
}
}
}
#Copy-Item -Path "C:\Temp\SQL_Config_Standard.ini" -Destination "C:\Scripts" -Force
#Remove-Item -Path "C:\Temp\SQL_Config_Standard.ini" -Force
不幸的是,这并没有按预期工作。它将 IACCEPTSQLSERVERLICENSETERMS 和 IACCEPTPYTHONLICENSETERMS 等第一个参数替换为哈希值,但如果必须替换 SQLUSERDBDIR 和 SQLUSERDBLOGDIR 等文件夹参数,则会失败:
The Detected Value Of The SQL Config Parameter 'IACCEPTSQLSERVERLICENSETERMS' Differs From The User - Defined Value ! [ False ]
OLD : IACCEPTSQLSERVERLICENSETERMS="False"
NEW : IACCEPTSQLSERVERLICENSETERMS="TESTNEU"
Changing Value Of The SQL Config Parameter 'IACCEPTSQLSERVERLICENSETERMS' To The User - Defined Value ! [ TESTNEU ]
The Detected Value Of The SQL Config Parameter 'IACCEPTPYTHONLICENSETERMS' Differs From The User - Defined Value ! [ True ]
OLD : IACCEPTPYTHONLICENSETERMS="True"
NEW : IACCEPTPYTHONLICENSETERMS="Cool"
Changing Value Of The SQL Config Parameter 'IACCEPTPYTHONLICENSETERMS' To The User - Defined Value ! [ Cool ]
The Detected Value Of The SQL Config Parameter 'INSTANCENAME' Differs From The User - Defined Value ! [ SQLEXPRESS ]
OLD : INSTANCENAME="SQLEXPRESS"
NEW : INSTANCENAME="SQLNEU"
Changing Value Of The SQL Config Parameter 'INSTANCENAME' To The User - Defined Value ! [ SQLNEU ]
The Detected Value Of The SQL Config Parameter 'SQLUSERDBDIR' Differs From The User - Defined Value ! [ C:\DB\Databases ]
OLD : SQLUSERDBDIR="C:\DB\Databases"
NEW : SQLUSERDBDIR="C:\DBTest\Databases"
Changing Value Of The SQL Config Parameter 'SQLUSERDBDIR' To The User - Defined Value ! [ C:\DBTest\Databases ]
The Detected Value Of The SQL Config Parameter 'SQLUSERDBLOGDIR' Differs From The User - Defined Value ! [ C:\DB\Logs ]
OLD : SQLUSERDBLOGDIR="C:\DB\Logs"
NEW : SQLUSERDBLOGDIR="C:\TestDB\Logs"
Changing Value Of The SQL Config Parameter 'SQLUSERDBLOGDIR' To The User - Defined Value ! [ C:\TestDB\Logs ]
The regular expression pattern SQLUSERDBLOGDIR="C:\DB\Logs" is not valid.
At C:\Scripts\filetest.ps1:72 char:162
+ ... andard , $( $SQL_Server_Config_Parameters[ $Config_Entries_Parameter ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (SQLUSERDBLOGDIR="C:\DB\Logs":String) [], RuntimeException
+ FullyQualifiedErrorId : InvalidRegularExpression
您能否给我一个提示,为什么会发生这种情况以及如何修改其工作方式符合预期的代码?
非常感谢。
最好的问候 NumeroUnoDE
解决方案
多谢。这完美地工作。但我现在想用全局临时目录替换临时路径“C:\Temp\SQL.ini”,所以我将条目更改为: $content = Get-Content -path "$env:TEMP\SQL_Config_Standard.ini"
这很好用,但是如果以后想通过执行命令“Remove-Item -Path”$env:TEMP\SQL_Config_Standard.ini“-Force”来删除临时文件,我总是会收到以下消息:
Remove-Item : 指定路径 C:\Users\NICK~1.FUR 的对象不存在。所以它使用 DOS 名称而不是目录的全名?为什么以及如何防止这种情况?
最好的问候丹尼斯
推荐阅读
- javascript - .keydown() 当按下返回键
- c# - UWP C# ListView 返回点击行的Id值
- java-8 - iText 7.0.2 将固定大小的表格添加到文档文本不换行并且某些情况进入无限循环
- c# - 压缩 base64 字符串时,LZ4Net.Wrap 结果为更大的字符串
- android - 错误:资源“attr/tintMode”的重复值与配置
- android - C++读取内部文件Android NDK
- java - 在返回和传递值时遇到问题;“数数”
- angular - Angular - 无法使用 Bing Map 图钉单击重定向到另一个组件
- ios - iOS 11 UIImagePickerController 奇怪的问题
- mysql - 如何编写 SQL 查询根据加权操作和时间衰减对用户进行排名?