PowerShellスクリプトからの引数でシェルコマンドを実行します。

StackOverflow https://stackoverflow.com/questions/2479434

  •  21-09-2019
  •  | 
  •  

質問

私は、bcpを使用してリモートSQLデータベースからいくつかのテーブルを抽出して保存する必要があります。私は各テーブルにBCP起動してデータを保存するためのPowerShellスクリプトを書きたいと思います。これまでのところ私は、BCPのために必要な引数を作成し、このスクリプトを持っています。しかし、私はBCPに引数を渡す方法を見つけ出すことはできません。私は、スクリプトを実行するたびに、それはだけではなく、BCPのヘルプを示しています。これは本当に簡単に私はなっておりませんことを何かをしなければならない。

#commands bcp database.dbo.tablename out c:\temp\users.txt -N -t, -U uname -P pwd -S <servername>
$bcp_path = "C:\Program Files\Microsoft SQL Server\90\Tools\Binn\bcp.exe"
$serverinfo =@{}
$serverinfo.add('table','database.dbo.tablename')
$serverinfo.add('uid','uname')
$serverinfo.add('pwd','pwd')
$serverinfo.add('server','servername')
$out_path= "c:\Temp\db\"
$args = "$($serverinfo['table']) out $($out_path)test.dat -N -t, -U $($serverinfo['uid']) -P $($serverinfo['pwd']) -S $($serverinfo['server'])"

#this is the part I can't figure out
& $bcp_path $args
役に立ちましたか?

解決

まず、$argsは自動変数です。あなたがそれを設定することはできませんので、$args = fooなどの任意の行には何もしません(上でもstrictモードで、苦情が素敵だったでしょうが)。

次に、あなただけのプログラムを単一の引数(文字列)を渡しています。私はスペースが含まれていますが、プログラムは単一の引数を見ているので、彼らは適切に、エスケープするか、括弧で囲まれています。

あなたは、変数事前にそれを保存したい場合は、代わりに単一の文字列で、プログラムへの引数の配列を使用する必要があります。

:そして、あなたはそれに名前を付けるために$argsとは異なるものが必要
$arguments = "$($serverinfo['table'])",
             'out',"$($out_path)test.dat",
             '-N','-t,',
             '-U',"$($serverinfo['uid'])",
             '-P',"$($serverinfo['pwd'])",
             '-S',"$($serverinfo['server'])"

& $bcp_path $arguments
それとも、私が好むものを、実際に、あなたは、単にここで醜さのほとんどを取り除く単一の行でそれを書くことができます:

$out_path = 'c:\Temp\db'
& $bcp_path $serverinfo['table'] out $out_path\test.dat -N '-t,' -U $serverinfo['uid'] -P $serverinfo['pwd'] -S $serverinfo['server']

他のヒント

いくつかのコマンドラインは、スラッシュ、引用符、二重引用符、等しく、コロン、ダッシュで真のカクテルをクレイジー江南スタイルの引数を受け入れるために、その必要性をアプリます。

PowerShellは、私の経験では、時々だけでは対応できません。私は.cmdのファイルへの書き出しなどのように、CMD.EXEからそれを実行してます:

echo $("Running command: " + $commandLine);

$rnd = $(([string](Get-Random -Minimum 10000 -Maximum 99999999)) + ".cmd");
$commandFilePath = $(Join-Path -Path $env:TEMP -ChildPath $rnd);
echo $commandLine | Out-File -FilePath $commandFilePath -Encoding ascii;

& cmd.exe /c $commandFilePath

を確認してくださいASCIIとして出力デフォルト以来、Unicodeはcmd.exeので素敵を果たしていない可能性があります(それは私に吠え、私の最初の試みで奇妙な文字を示した)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top