AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 305284
Accepted
Ian W
Ian W
Asked: 2021-12-23 05:16:54 +0800 CST2021-12-23 05:16:54 +0800 CST 2021-12-23 05:16:54 +0800 CST

在 T-SQL 中使用带有参数的 xp_cmdshell 调用 powershell 脚本

  • 772

对于来自 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' 不存在。

任何人都可以建议转义此文件路径的方法吗?

谢谢

sql-server stored-procedures
  • 2 2 个回答
  • 1729 Views

2 个回答

  • Voted
  1. Dominique Boucher
    2021-12-23T05:22:46+08:002021-12-23T05:22:46+08:00

    如果您查看打印命令返回的行,它看起来像这样:

    powershell -command "C:\SQL_Powershell\General\MoveFile.ps1" ""C:\BPA Exports\Change Point 1\Processing\"" "ExportCP1Data" ".csv"
    

    注意路径之前和之后的“”......我想那些应该是简单的“(不是双重的)。

    将它们从您的 @sqlFilePath 变量中取出,然后重试。

    • 1
  2. Best Answer
    David Browne - Microsoft
    2021-12-24T14:53:38+08:002021-12-24T14:53:38+08:00

    好的。原来这既不是 CMD.EXE 解析也不是 PowerShell 解析。相反,它是从操作系统解析命令行参数的规则,记录在这里。

    前面有反斜杠 (") 的双引号被解释为文字双引号 (")。

    主函数和命令行参数

    这在此处的 Powershell 停靠点中进行了解释:about_Parsing:传递包含引号字符的参数

    因此,powershell 脚本的第一个参数变为:

    C:\BPA Exports\Change Point 1\Processing" -filename ExportCP1Data -filext .csv 
    

    其他两个为空。所以当传递一个以你结尾的命令行参数时,\"你必须加倍\或省略它。所以像:

    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 -File "C:\SQL_Powershell\General\MoveFile.ps1" -location "'+@sqlFilePath+'" -filename "'+@sqlfilename+'" -filext "'+@sqlfilext+'" '
    
    Print @PScmd
    EXEC xp_cmdshell @PScmd
    
    • 1

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve