sql-server - CMD powershell命令不允许管道

标签 sql-server powershell cmd command-line-interface xp-cmdshell

我正在尝试使用xp_cmdshell来使SQL执行一些powershell命令,该命令一直在起作用,但是我遇到了一个异常问题。当我尝试使用管道时,它在管道之后无法识别命令。我从标准cmd行尝试过此操作,可以确认是否发生了相同的问题。这是我正在使用的命令:

powershell.exe -command get-eventlog -Newest 10 -LogName Application -Before "2018-04-18T22:02:23" -After "2018-04-17T22:02:23" -computername dk01sv1115 | Select Message

当我使用命令而不最后使用| Select Message时,它可以正常工作。问题是我没有收到尝试使用“选择和格式化”功能来获取完整详细信息的完整事件消息,但是管道似乎是问题所在。如果在启动powershell之后运行相同的命令(IE运行powershell.exe,然后运行命令),则可以正常工作,但是,当您使用SQL在SQL中作为单独的一行运行powershell.exe时,它将无限期地运行。示例SQL:
Declare @command nvarchar(1000),@computername nvarchar(1000)

Set @computername = 'test'
Set @command = 'powershell.exe 
get-eventlog -Newest 10 -LogName Application -Before "' + REPLACE(Convert(VARCHAR(255),GETDATE(),120),' ','T') +'" -After "' + REPLACE(Convert(varchar(255),DateAdd(dd,-1,GETDATE()),120),' ','T') + '" -computername ' + @computername + '
exit'

exec xp_cmdshell @command 

最佳答案

| Select Message部分由cmd.exe而不是PowerShell解释,因为管道符号(|)在cmd.exe中也是特殊的(含义大致相同),并且您没有将其括在"..."中。

cmd.exe 调用PowerShell的的最佳方法是将整个PowerShell命令作为单双引号字符串("...")传递给-Command参数:

powershell.exe -command "get-eventlog -Newest 10 -LogName Application -Before 2018-04-18T22:02:23 -After 2018-04-17T22:02:23 -computername dk01sv1115 | Select Message"

有关嵌入式报价的提示:
  • 要引用文字,可以在整个'...'字符串内使用"..."
  • 请注意,原始命令中引用的值实际上并不需要引用(例如"2018-04-18T22:02:23"),因此我在重新编写公式时使用了未引用的值。
  • 如果您需要嵌入"字符,请使用\"(原文如此-尽管PowerShell内部是`充当转义字符)。
  • 关于sql-server - CMD powershell命令不允许管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49921868/

    相关文章:

    .net - 默认网络数据包大小的差异 : SqlConnection vs. SQL Server 默认值

    regex - 使用正则表达式提取(重复)包含括号的组

    c - 为什么我需要多个 EOF (CTRL+Z) 字符?

    variables - 在批处理文件的文件路径目录中使用变量

    c++ - 将变量设置为 cmd.exe

    sql - 将 YYYYMM 转换为 MMMYY

    sql-server - 短文本数据库键与数字键;什么时候比另一个更有效率?

    c# - 为什么从 C# 调用 PowerShell 会抛出 System.Management.Automation.CommandNotFoundException?

    带连接的 SQL SELECT INTO 查询,错误 "There is already an object named ' **** *' in the database."

    node.js - Powershell 检测何时添加或删除设备