繁体   English   中英

从包含 power shell 命令的 power shell 脚本创建代理作业

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM