2016-07-24 1 views
0

複数のクライアント用にSQL ServerとLDAPサーバーからデータを取得しようとしています。私は最初にSQLデータを取得し、次にLDAPデータを取得する必要があります。 Unixシェルでは、サブプロセスの周りにループを作成して、両方の検索を各クライアントで行い、それが完了するのを待つことができました。しかし、Windowsのバッチファイルとして、それは順次発生します。私。あるクライアントのデータを取得するまで、次のクライアントには移動しません。どのようにして各クライアントのデータを同時に取得できますか?ここでは、私が持っているものです。複数のプログラムをバックグラウンドに配置しないで起動するWindowsバッチファイル

REM Get DB and client info. from config file 
for /F "tokens=1,2,3,4,5,6 delims=| eol=#" %%G in (%cfg%\%env%.data) do (
    REM Mark file as being in process of receiving data 
    type nul > %%K.tmp 

    REM Get data and remove tmp file to indicate completion 
    start cmd /C sqlcmd .... -Q "A long query" ^> %%K.dat1 && "c:\Program Files\Softerra\LDAP Administrator 4\laimex.exe" ... /sql "Another query" > %%K.dat2 && del %%K.tmp 
) 

何らかの理由で、私は後で1がそれを必要としませんが^>のようにエスケープ最初のリダイレクトを行う必要があります。この時点では、すべてがバックグラウンドで取り出されると仮定しています。作成したゼロバイトの一時ファイルが存在するかどうかをチェックすることで、プロセスが完了した時点を確認する必要があります。しかし、ループを通る各反復は、バックグラウンドに配置されることによって直前に完了するのではなく、前のループが完了したときにのみ開始されます。誰も私はこれを修正する方法を提案することはできますか?あなたにも(^&^&を)&&をエスケープする必要が

おかげで、 ベン

+0

ヒント:代わりに 'トークンを= 1,2,3,4,5,6'指定することも可能です'tokens = 1-6'。なぜなら、最初の6つのトークンが指定された理由はわかりません。なぜなら、ポストされたバッチコードは '%% G'と' %% K'でトークン1と2のみを使用するからです。 – Mofi

+0

個々にリストする代わりに、tokens = 1-6を使うことができます。すべてのトークンが使用されていますが、「...」と置き換えられたほとんどの行オプションは削除されているので、私が尋ねてきたことに気づかず、私がやっていたことは見やすくなりました。 – Ben

答えて

0

、それ以外の場合は、すぐにスタートが発射されるようにした後、すべてを実行します。例:

1は新しいシェルで正しく実行され、2はメインウィンドウを引き継ぎます(望むものではありません)。

start cmd /C ping 127.0.0.1 && ping 127.0.0.2 

新しいウィンドウで次々に実行されます。

start cmd /C ping 127.0.0.1 ^&^& ping 127.0.0.2 

これと同じもう1つの方法です。

start cmd /C "ping 127.0.0.1 && ping 127.0.0.2" 

>年代をエスケープまた、これはうまくいくかもしれない:

start cmd /C sqlcmd .... -Q "A long query" ^> %%K.dat1 ^&^& "c:\Program Files\Softerra\LDAP Administrator 4\laimex.exe" ... /sql "Another query" ^> %%K.dat2 ^&^& del %%K.tmp 
関連する問題