我在powershell中有一个字符串,其中包含一个本机sqlcmd命令。命令本身可以在cmd.exe中成功执行。我很难在powershell中执行它们。有人可以帮忙吗?感谢。
这是sql.sql
select @@servername
go
select @@servicename
这是我从cmd.exe执行sqlcmd命令时的结果
C:\Users\test>sqlcmd -S "(local)\instance1" -U a -P a -i "c:\temp\sql.sql"
--------------------------------------------------
thesimpsons\INSTANCE1
(1 rows affected)
--------------------------------------------------
INSTANCE1
(1 rows affected)
C:\Users\test>
这是用于调用sqlcmd命令的powershell脚本。
$sql = @"
sqlcmd -S "(local)\instance1" -U a -P a -i "c:\temp\sql.sql"
"@
Invoke-Command $sql
当我执行此PowerShell脚本时,出现以下错误。
PS C:\TEMP> $sql = @"
sqlcmd -S "(local)\instance1" -U a -P a -i "c:\temp\sql.sql"
"@
Invoke-Command $sql
Invoke-Command : Parameter set cannot be resolved using the specified named parame
ters.
At line:5 char:15
+ Invoke-Command <<<< $sql
+ CategoryInfo : InvalidArgument: (:) [Invoke-Command], ParameterBin
dingException
+ FullyQualifiedErrorId : AmbiguousParameterSet,Microsoft.PowerShell.Commands
.InvokeCommandCommand
答案 0 :(得分:22)
要调用Win32可执行文件,您需要使用调用运算符&
,如下所示:
& sqlcmd -S "(local)\instance1" -U a -P a -i "c:\temp\sql.sql"
答案 1 :(得分:17)
您也可以停止使用外部&#39; SQLCMD.EXE&#39;并使用Invoke-Sqlcmd cmdlet代替:
Invoke-Sqlcmd是一个SQL Server cmdlet,它运行包含语言语句(Transact-SQL和XQuery)的脚本以及sqlcmd实用程序支持的命令
只需打开&#39; sqlps&#39;实用程序并运行
Invoke-Sqlcmd -InputFile "C:\temp\sql.sql"
请参阅Running SQL Server PowerShell
在使用&#39; Invoke-Sqlcmd&#39;;之前,您还可以在PowerShell中手动加载SQL Server管理单元。
对于MS SQL Server 2012,您可以通过运行
来实现
Import-Module SqlPs
答案 2 :(得分:5)
这就是我在脚本中构建一些外部命令的方法
$scriptblock = {fullpath\sqlcmd -S `"(local)\instance1`" <# comment option -S #>`
-U a `
-P a `
-i `"c:\temp\sql.sql`" }
Invoke-Command -ScriptBlock $scriptBlock
然后你可以在里面使用$ args变量,甚至可以远程启动它。
$scriptblock = {fullpath\sqlcmd -S `"(local)\instance1`" <# comment option -S #>`
-U a `
-P a `
-i `"$($args[0])`" }
Invoke-Command -ScriptBlock $scriptBlock -argumentList "c:\temp\sql.sql" -computer "remote1"
备注:
这允许对每个参数进行评论。
小心不要忘记“`”,并且在它们位于线的末尾之后没有空格。
答案 3 :(得分:3)
使用Invoke-Expression
而不是Invoke-Command
答案 4 :(得分:2)
invoke-command的第一个位置参数是-scriptblock,它需要一个脚本块参数。要利用here-string构建命令然后使用invoke-command运行它,您需要将here-string转换为脚本块:
$sql = @"
sqlcmd -S "(local)\instance1" -U a -P a -i "c:\temp\sql.sql"
"@
Invoke-Command ([scriptblock]::create($sql))
答案 5 :(得分:0)
实例名称和用户名都应该是完全限定的
<domain_name>\Instanc_name
和<domai_name>\Username
。只有您的实例名称才能正确编写脚本。
答案 6 :(得分:0)
对于我来说,使用&amp ;;在PowerShell脚本中使用sqlcmd是有用的。运算符,请参阅示例以生成csv文件:
&安培; cmd / c“sqlcmd -S $ sv -i $ PROCFILE -s,-v varDB = $ dbclean -o $ filename”
$sv
的服务器名称类似于SERVERNAME\INSTANCE
$PROCFILE
与d:\TSTSQL\Sqlquery.SQL
$filename
是d:\TSTSQL\Desiredoutfilename.CSV
$dbclean
是传递给sql文件的参数