[英]Create agent job from power shell script with including of power shell command
我尝试使用 Power Shell 脚本自动执行 SQL Server 2016 安装过程。 当我使用文件参数执行 Invoke-SqlCmd 时:
Invoke-SqlCmd -InputFile "..\res\test.sql" -ServerInstance "(local)" -Database "master" -ErrorAction Stop
其中包括带有 power shell 命令的代理作业创建脚本:
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
它因错误而停止:
Invoke-SqlCmd : 'INST' scripting variable not defined
显然,这是我需要在创建之前转义的 $ 字符。 有没有人知道如何做到这一点? 我搜索过,但找不到任何有用的东西。
禁用 InvokeSQLcmd 的变量
Invoke-SqlCmd -InputFile "..\\res\\test.sql" -ServerInstance "(local)" -Database "master" -ErrorAction Stop -DisableVariables
PowerShell 正在尝试解析您的$(ESCAPE_xxxx(yyyy))
块,因此您需要在将其发送到 Invoke-SqlCmd 之前对其进行转义。 最简单的方法是使用replace
运算符:
$script = Get-Content "..\res\test.sql"
$script -replace '\(ESCAPE_(\w+)\((.+)\)\)','`(ESCAPE_$1`($2`)`)'
Invoke-SqlCmd -InputFile $script -ServerInstance "(local)" -Database "master" -ErrorAction Stop
显然,您将无法对 SQL 命令块中的每个括号进行转义,但是您可以进行一些实验来找出这种替换需要多窄或多宽。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.