如何在SQL中格式化我的字符串,以便在Powershell中正确解释它?

时间:2017-06-07 20:58:58

标签: sql powershell ssms-2016

我目前正在处理一个我想从SSMS运行的简单SQL脚本。该脚本应该做的是获取数据库,对其进行备份,然后制作该备份的.zip文件。

我遇到的问题是在尝试压缩备份时。我在文件的开头声明了所有变量,我相信当我尝试执行@sqlcmd时,Powershell没有正确读取字符串。

    SET @sqlcmd = ('powershell.exe [IO.Compression.ZipFile]::CreateFromDirectory("' + @bkpath + '", "C:\'+ @fileName + '.zip")')
    PRINT @sqlcmd 
    -- this statement returns (powershell.exe [IO.Compression.ZipFile]::CreateFromDirectory("C:\Backup\", "C:\ScriptingTestDB_20170607.zip"))
    EXEC xp_cmdshell @sqlcmd   

运行此代码会在结果窗口中返回以下输出:

At line:1 char:47
+ [IO.Compression.ZipFile]::CreateFromDirectory(C:\Backup", C:\Scriptin ...
+                                               ~
Missing ')' in method call.
At line:1 char:56
+ ... le]::CreateFromDirectory(C:\Backup", C:\ScriptingTestDB_20170607.zip)
+                                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The string is missing the terminator: ".
At line:1 char:47
+ ... le]::CreateFromDirectory(C:\Backup", C:\ScriptingTestDB_20170607.zip)
+                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Unexpected token 'C:\Backup", C:\ScriptingTestDB_20170607.zip)' in expression or statement.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : MissingEndParenthesisInMethodCall
NULL

经过一些测试后,我想我发现问题在于Powershell如何解释SQL字符串。由于有很多引用,即使SQL正确地打印出字符串,当Powershell得到它时,格式变得混乱,因此需要在那里更改某些东西,但仍然不确定是什么。有没有人知道我可以用来了解如何编写SQL代码的指南,以便Powershell阅读以下内容:

[IO.Compression.ZipFile]::CreateFromDirectory("C:\Backup\", "C:\ScriptingTestDB_20170607.zip")

1 个答案:

答案 0 :(得分:2)

您需要使用"转义\个字符。我的工作脚本:

declare @sqlcmd varchar(1000), @bkpath nvarchar(max) = 'C:\i1\tmp', @filename nvarchar(max) = 'file'

SET @sqlcmd = 'powershell.exe Add-Type -AssemblyName System.IO.Compression.FileSystem; [System.IO.Compression.ZipFile]::CreateFromDirectory(\"' + @bkpath + '\", \"C:\i1\'+ @fileName + '.zip\")'
EXEC xp_cmdshell @sqlcmd