当我按如下方式调用xp_cmdshell时,7z.exe
实际运行,并且它的输出是正确的,因为不包含任何参数:
declare @Command VARCHAR(1000)
set @Command = '"C:Program Files7-Zip7z.exe" a '
exec master..xp_cmdshell @command
select @Command
输出:
output
NULL
7-Zip 18.05 (x64) : Copyright (c) 1999-2018 Igor Pavlov : 2018-04-30
NULL
NULL
NULL
Command Line Error:
Cannot find archive name
NULL
添加文件后,出现完全不同的错误:找不到7z.exe
:
declare @Command VARCHAR(1000)
set @Command = '"C:Program Files7-Zip7z.exe" a ' + '"' + 'C:TO_ERASEToZip.txt' + '"'
exec master..xp_cmdshell @command
select @Command
输出:
output
'C:Program' is not recognized as an internal or external command,
operable program or batch file.
NULL
问题可能是什么?
唯一的区别是我添加了文件名作为参数。我会理解7z.exe
是否生成错误,但 Windows 找不到exe
文件。
有趣的问题。我四处寻找有关文件名中空格的各种解决方案,并遇到了THIS。我不确定为什么您的第一个示例有效,但他们的解决方案是在路径之前添加一些内容,以便路径不是命令中的第一件事。
declare @Command VARCHAR(1000)
set @Command = 'cd.. && "C:Program Files7-Zip7z.exe" a ' + '"' + 'C:TO_ERASEToZip.txt' + '"'
exec master..xp_cmdshell @command
select @Command
另一种可能性是使用cd
作为第一个命令,然后直接调用程序,如以下示例:
DECLARE @p_cmd varchar(255)
SET @p_cmd = 'cd "C:Program Filesedbmtkbin" && runMTK.bat -dataOnly -tables table_changes -sourcedbtype sqlserver -targetdbtype postgresql -targetSchema public dbo'
EXEC xp_cmdshell @p_cmd