对于来自 T_SQL的 Calling powershell 函数,我一直在使用以下参考资料。这是在 SQL Server 2016 上
我需要帮助的元素是在 SQL 中调用传递参数(文件路径/文件名/文件扩展名)的 powershell 脚本的格式。ps 脚本对已用于批量上传的文件进行简单的重命名和移动。
ps 脚本包含在问题的底部,但我已经独立于 SQL 测试了该文件,并且它按预期运行
我正在开发的 T-SQL 是
--Turn on cmd shell may need a sysadmin account
EXEC master.dbo.sp_configure 'show advanced options', 1
RECONFIGURE WITH OVERRIDE
EXEC master.dbo.sp_configure 'xp_cmdshell', 1
RECONFIGURE WITH OVERRIDE
Declare @sqlFilePath nvarchar(255)='"C:\BPA Exports\Change Point 1\Processing\"'
Declare @sqlfilename nvarchar(255)='ExportCP1Data'
Declare @sqlfilext nvarchar(20)='.csv'
Declare @PScmd nvarchar (255)
Set @PScmd='powershell -command "C:\SQL_Powershell\General\MoveFile.ps1" "'+ @sqlFilePath +'" "'+@sqlfilename+'" "'+@sqlfilext+'"'
Print @PScmd
EXEC xp_cmdshell @PScmd
--Turn off cmdshell for safety
EXEC master.dbo.sp_configure 'xp_cmdshell', 0
RECONFIGURE WITH OVERRIDE
EXEC master.dbo.sp_configure 'show advanced options', 0
RECONFIGURE WITH OVERRIDE
我收到的错误信息
The string is missing the terminator: ".
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordEx
ception
+ FullyQualifiedErrorId : TerminatorExpectedAtEndOfString
NULL
由于这有望最终以远程调用的 usp 结束,因此有人还可以确认 db 用户的推荐权限。
我正在考虑使用对 ps 脚本的本地位置和文件将从/移到的文件夹具有文件读/写权限的 AD 用户。我目前对 SQL usp 的思路是使用类似的东西
CREATE PROCEDURE Utility.DoSomethingPotentiallyScary
WITH EXECUTE AS OWNER
AS
除非有更好的方法?
为此的powershell脚本如下
param
(
[String] $location,
[String] $filename,
[String] $filext
)
Function RenameMoveFile($locationPath, $fileName, $extension, $archiveFolder)
{
$date =Get-Date -Format "yyyyMMdd_HHmmss"
$old = $locationPath + $fileName + $extension
$new = $locationPath + $fileName + "_" + $date + $extension
$archiveFolder = $locationPath + $archiveFolder + "\"
Rename-Item $old $new
Move-Item $new $archiveFolder
}
## This is the only part that we'd edit
RenameMoveFile -locationPath $location -fileName "ExportCP1Data" -extension ".csv" -archiveFolder "Archive"
更新我已经做了一些测试,我相信是文件路径中的空白导致了问题。我已将其放入 ISE 进行测试,如果我在 ps 文件中硬编码文件路径,则该命令有效。但是,当我在 ISE 中尝试此操作时,
powershell "C:\SQL_Powershell\General\MoveFile.ps1" "C:\BPA Exports\ChangePoint1\Processing"
我得到以下消息(注意 \ 定位)
'C:\BPA\Exports\ChangePoint1\Processing' 不存在。
任何人都可以建议转义此文件路径的方法吗?
谢谢
如果您查看打印命令返回的行,它看起来像这样:
注意路径之前和之后的“”......我想那些应该是简单的“(不是双重的)。
将它们从您的 @sqlFilePath 变量中取出,然后重试。
好的。原来这既不是 CMD.EXE 解析也不是 PowerShell 解析。相反,它是从操作系统解析命令行参数的规则,记录在这里。
主函数和命令行参数
这在此处的 Powershell 停靠点中进行了解释:about_Parsing:传递包含引号字符的参数
因此,powershell 脚本的第一个参数变为:
其他两个为空。所以当传递一个以你结尾的命令行参数时,
\"
你必须加倍\
或省略它。所以像: