从power shell脚本创建代理作业,包括power shell命令

时间:2017-10-09 15:21:04

标签: sql-server powershell sql-agent

我尝试使用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,我需要在创建前逃脱。有人知道如何做到这一点?我搜索过,但找不到任何有用的东西。

2 个答案:

答案 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命令块中的每个括号,但是你可以做一些实验来找出这个替换需要的范围有多窄。

相关问题