How to execute sqlcmd from powershell?
我在 powershell 中有一个字符串,其中包含一个本机 sqlcmd 命令。命令本身可以在cmd.exe中成功执行。我很难在 powershell 中执行它们。任何人都可以帮忙吗?谢谢。
这是 sql.sql
1 2 3 | select @@servername go select @@servicename |
这是我从 cmd.exe
执行 sqlcmd 命令时的结果
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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 脚本。
1 2 3 4 5 | $sql = @" sqlcmd -S"(local)\\instance1" -U a -P a -i"c:\\temp\\sql.sql" "@ Invoke-Command $sql |
当我执行这个 powershell 脚本时,我得到了以下错误。
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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 |
要调用 Win32 可执行文件,您需要使用调用运算符
1 | & sqlcmd -S"(local)\\instance1" -U a -P a -i"c:\\temp\\sql.sql" |
您也可以停止使用外部 \\'SQLCMD.EXE\\' 并改用 Invoke-Sqlcmd cmdlet:
Invoke-Sqlcmd is a SQL Server cmdlet that runs scripts that contain statements from the languages (Transact-SQL and XQuery) and commands that are supported by the sqlcmd utility
只需打开 \\'sqlps\\' 实用程序并运行
1 | Invoke-Sqlcmd -InputFile"C:\\temp\\sql.sql" |
请参阅运行 SQL Server PowerShell
您还可以在使用 \\'Invoke-Sqlcmd\\' 之前在 PowerShell 中手动加载 SQL Server 管理单元;
对于 MS SQL Server 2012,您可以通过运行
这就是我在脚本中构建一些外部命令的方式
1 2 3 4 5 | $scriptblock = {fullpath\\sqlcmd -S `"(local)\\instance1`" <# comment option -S #>` -U a ` -P a ` -i `"c:\\temp\\sql.sql`" } Invoke-Command -ScriptBlock $scriptBlock |
然后您可以在其中使用 $args 变量,甚至可以远程启动它。
1 2 3 4 5 | $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" |
备注:
这允许评论每个参数。
注意不要忘记 "`" 并且在它们之后的行尾没有空格。
使用
invoke-command 的第一个位置参数是-scriptblock,它需要一个脚本块参数。要利用 here-string 构建命令,然后使用 invoke-command 运行它,您需要将 here-string 转换为脚本块:
1 2 3 4 5 | $sql = @" sqlcmd -S"(local)\\instance1" -U a -P a -i"c:\\temp\\sql.sql" "@ Invoke-Command ([scriptblock]::create($sql)) |
这对我来说是在 powershell 脚本中使用 sqlcmd 使用的
实例名称和用户名都应该是完全限定的