2012-08-25 54 views
0

下面的代碼綁定,直接設置-v參數工作如何SQLCMD的-v參數從一個PowerShell

$sqlcmd = @(Resolve-Path "$env:ProgramFiles\Microsoft SQL Server\*\Tools\binn\SQLCMD.EXE")[0] 

$path1 = 'D:\somescript.sql' 

& $sqlcmd -b -S NB-BK\SQLEXPRESS -d BK_Prod -U sa -P mypassword -l 180 -i $path1 -v Mandant=1 SAPMandant="009" SAPEinrichtung="0001" 

但我需要一種方法來從一個PowerShell變量設置這些值。

我想:

$sqlcmd = @(Resolve-Path "$env:ProgramFiles\Microsoft SQL Server\*\Tools\binn\SQLCMD.EXE")[0] 

$path1 = 'D:\somescript.sql' 

$sqlcmdparameters = 'Mandant=1 SAPMandant="009" SAPEinrichtung="0001" ' 
& $sqlcmd -b -S NB-BK\SQLEXPRESS -d BK_Prod -U sa -P mypassword -l 180 -i $path1 -v $sqlcmdparameters 

我發現這個on SO,但它並沒有幫助我。

回答

1

嘗試使用啓動過程。這就是我爲Powershell命令行解析問題所做的。首先嚐試調用運算符(&),如果這不起作用,則將其包含在啓動進程調用中。

$tempFile = [io.path]::GetTempFileName() 

$exitCode = (start-process -FilePath $sqlcmd -ArgumentList @" 
-b -S NB-BK\SQLEXPRESS -d BK_Prod -U sa -P mypassword -l 180 -i $path1 -v $sqlcmdparameters 
"@ -Wait -RedirectStandardOutput $tempFile -NoNewWindow -Passthru).ExitCode 

當使用啓動過程時,通常需要捕獲exitcode並將輸出重定向到臨時文件中以獲取結果。然後我將有一些代碼來檢查的try/catch $退出碼和清理臨時文件/ finally塊

+0

+1的一個可行的解決方案。我接受你的答案,因爲它顯示瞭如何在所有參數映射中使用字符串。我發現了一個更直接的解決方案。看到我的答案。 –

2

我發現下面的解決方案爲PowerShell的V2

$sqlcmd = @(Resolve-Path "$env:ProgramFiles\Microsoft SQL Server\*\Tools\binn\SQLCMD.EXE")[0] 
$path1 = 'D:\somescript.sql' 
$cmdparameters = @(
    'Mandant=1', 
    'SAPMandant="009"' 
) 

& $sqlcmd -b -S NB-BK\SQLEXPRESS -d BK_Prod -U sa -P mypassword -l 180 -i $path1 -v $cmdparameters 
+1

有趣的傳遞數組的作品。使用 - %運算符在V1/V2中調用傳統命令在Powershell V3中會更好。 Keith Hill的博客文章使用V3的sqlcmd -v示例 - %運算符:http://rkeithhill.wordpress.com/2012/01/02/powershell-v3-ctp2-provides-better-argument-passing-to-exes/ –

相關問題