我正在尝试使用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/