首页 > 解决方案 > 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

标签: powershell

解决方案


多谢。这完美地工作。但我现在想用全局临时目录替换临时路径“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 名称而不是目录的全名?为什么以及如何防止这种情况?

最好的问候丹尼斯


推荐阅读