我尝试使用power shell脚本自动化SQL Server 2016安装过程。当我使用file:
参数执行Invoke-SqlCmd时.zip(Iterable<? extends Publisher<? extends T>>, Function<? super Object[], ? extends R>).
包括带有power shell命令的代理作业创建脚本:
Invoke-SqlCmd -InputFile "..\res\test.sql" -ServerInstance "(local)" -Database "master" -ErrorAction Stop
它停止了错误:
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Erase Phantom System Health Records.',
@step_id=3,
@cmdexec_success_code=0,
@on_success_action=1,
@on_success_step_id=0,
@on_fail_action=2,
@on_fail_step_id=0,
@retry_attempts=0,
@retry_interval=0,
@os_run_priority=0, @subsystem=N'PowerShell',
@command=N'if (''$(ESCAPE_SQUOTE(INST))'' -eq ''MSSQLSERVER'') {$a = ''\DEFAULT''} ELSE {$a = ''''};
(Get-Item SQLSERVER:\SQLPolicy\$(ESCAPE_NONE(SRVR))$a).EraseSystemHealthPhantomRecords()',
@database_name=N'master',
@flags=0
显然这是$ character,我需要在创建前逃脱。有人知道如何做到这一点?我搜索过,但找不到任何有用的东西。
答案 0 :(得分:1)
禁用InvokeSQLcmd变量
for i in [0..5]
答案 1 :(得分:0)
PowerShell正在尝试解析您的$(ESCAPE_xxxx(yyyy))
块,因此您需要在将它们发送到Invoke-SqlCmd之前将其转义。最简单的方法是the replace
operator:
$script = Get-Content "..\res\test.sql"
$script -replace '\(ESCAPE_(\w+)\((.+)\)\)','`(ESCAPE_$1`($2`)`)'
Invoke-SqlCmd -InputFile $script -ServerInstance "(local)" -Database "master" -ErrorAction Stop
显然,你不可能只是逃避SQL命令块中的每个括号,但是你可以做一些实验来找出这个替换需要的范围有多窄。