851) 別のPCへのファイルコピー(ユーザ名、パスワードが異なる場合) waruiko 2003/11/12(水) 16:13 |
|
|
|
以下の要件を満たすバッチファイルを作りたいのですが、ご助力頂けないでしょうか。 ・サーバ(以下SV)からdata.txtというファイルを複数クライアント(以下CL)のD:にコピーしたい。 ・全CLのDドライブは共有名"d"で共有している。 ・各CLはそれぞれ個別のユーザ名、パスワードでWindowsにログインしている。(yamada、sasakiなど) ・SV側のWindowsには各CL分のユーザ(yamada、sasakiなど)は作成していない。ただしSVはuserID.iniというファイルの中で各CLのユーザ名、パスワードを保持している。userID.iniの形式は次の通り (userID.iniの中身) [CL1] IPAddress = 192.168.1.101 UserName = yamada Password = abc [CL2] IPAddress = 192.168.1.102 UserName = sasaki Password = 123 [CL3] IPAddress = 192.168.1.103 UserName = tanaka Password = iroha (以下省略) ・総CL数は100台程度 ・SVのhostsに各CLのホスト名を定義しているので、名前解決可能。 ・環境はSVがWindows2000 Server、CLがWindows2000 Pro。 その他、説明不足な点がございましたらご指摘ください。 どうかよろしくお願い致します。 |
|
852) Re:別のPCへのファイルコピー(ユーザ名、パスワードが異なる場合) waruiko 2003/11/12(水) 16:34 |
|
|
|
失礼しました。大切なことを忘れていました。 ・userID.iniには全CL分の情報が定義してある。 ・毎回、全台にファイルをコピーするのではなく、SVが保持するCL.lstに記述されているものに対してのみ行う。CL.lstのフォーマットは以下の通り。 (CL.lstの中身) CL1 CL2 CL7 CL14 CL33 (以下省略) 大変申し訳ありませんでした。よろしくお願い致します。 |
|
853) Re:別のPCへのファイルコピー(ユーザ名、パスワードが異なる場合) ふぇむ 2003/11/12(水) 17:49 |
|
|
|
>以下の要件を満たすバッチファイルを作りたいのですが、ご助力頂けないでしょうか。 言語は何で作ろうとされています? バッチコマンドスクリプトのみしか使えない、といったような制約があったりしますか? それとも何でもOKですか? また、何を相談されようとしていますでしょうか? どの部分がどのようにわからないのでしょうか? |
|
854) Re2:別のPCへのファイルコピー(ユーザ名、パスワードが異なる場合) waruiko 2003/11/12(水) 20:17 |
|
|
|
>言語は何で作ろうとされています? >バッチコマンドスクリプトのみしか使えない、といったような制約があったりしますか? >それとも何でもOKですか? バッチあるいはWSHなどのスクリプト言語(?)が希望です。 VBとかCで作るプログラムでなければOKです。 >また、何を相談されようとしていますでしょうか? >どの部分がどのようにわからないのでしょうか? 要はファイルをコピーする際、SVと各CLでユーザ名、パスワードが異なるため、コピーコマンドをCLの台数だけfor文で回すだけでは対応できません。 クライアント毎にユーザ名とパスワードをuserID.iniから参照してコピーする方法を教えて頂きたいのです。 分かりづらい説明で申し訳ありませんでした。 |
|
857) Re3:別のPCへのファイルコピー(ユーザ名、パスワードが異なる場合) ふぇむ 2003/11/13(木) 05:08 |
|
|
|
>バッチあるいはWSHなどのスクリプト言語(?)が希望です。 >VBとかCで作るプログラムでなければOKです。 >要はファイルをコピーする際、SVと各CLでユーザ名、パスワードが異なるため、コピーコマンドをCLの台数だけfor文で回すだけでは対応できません。 >クライアント毎にユーザ名とパスワードをuserID.iniから参照してコピーする方法を教えて頂きたいのです。 例えば以下のような方針はいかがでしょうか。 ●userID.iniがこの形だとバッチコマンド群と相性が悪いので、バッチの初期段階において以下のような形に加工したテンポラリファイルを生成し、以下これを使う。 CL1:192.168.1.101:yamada:abc CL2:192.168.1.102:sasaki:123 CL3:192.168.1.103:tanaka:iroha この加工は、無理に書けばバッチスクリプトでもかけますが、ここは awk のスクリプトを使う方がもっとも楽だと思います。 ●バッチはサーバ側で動かす。サーバ側が保持するCL.lstに基づいて、for でループ。CL.lst の各行に対し、findstr /B を使って上記ファイルから該当の1行を抜き取る。 ●その1行をfor文を使って(上の形式なら): で4つにセパレートし(tokens=1,2,3,4* という感じ)、この情報を引数として1件処理するサブルーチンに分岐。 ●その1件処理サブルーチンでは、対象マシンの共有Dドライブを net use でマウントして、所定のファイルをコピーし、マウント解除。 ●きちんと各処理のログを残し、後から検証可能なようにする。 こんな感じで組んでみてはどうでしょうか。 |
|
859) Re4:別のPCへのファイルコピー(ユーザ名、パスワードが異なる場合) ふぇむ 2003/11/13(木) 15:25 |
|
|
|
>>要はファイルをコピーする際、SVと各CLでユーザ名、パスワードが異なるため、コピーコマンドをCLの台数だけfor文で回すだけでは対応できません。 >>クライアント毎にユーザ名とパスワードをuserID.iniから参照してコピーする方法を教えて頂きたいのです。 > >例えば以下のような方針はいかがでしょうか。 > (略) > >こんな感じで組んでみてはどうでしょうか。 > サンプル的に、この方針でちょっと書いてみました。 awk スクリプトが150行くらい。若干頑健に書いてみたので、手を抜くならもっと短くなるでしょう。若干長いので掲載は割愛。 本体のバッチコマンドスクリプトが制御関係の骨組みだけの素なものですが50行強(net use やコピーやログ取得その他細かい配慮含まず)。以下にのせてみました。awk 側がないとこのままでは動きません。 ここまではそんな深刻に難しいところなくつくれそうな気がしますが(awkスクリプトも含めて私で所要時間1時間くらいでしょうか)... あとは net use 関係でひっかからなければ。また、ジョブとして異常時の対処等さまざまな考慮が必要なはずで、そっちの方にかける時間の方が多いでしょうね。 ----------------------------- SAMPLE @echo off setlocal set BASE_USERID_INI=userid.ini set USERID_INI=awk-userid.ini set CL_LIST=CL.lst gawk -f convert.awk "%BASE_USERID_INI%" > "%USERID_INI%" for /F "usebackq tokens=*" %%a in ( "%CL_LIST%" ) do ( call :PICKUP_ONE_CLIENT "%%a" ) goto :end :PICKUP_ONE_CLIENT set CLIENT=%~1 for /F "usebackq tokens=*" %%b in ( `findstr /B "%CLIENT%" "%USERID_INI%"` ) do ( call :GET_ONE_CLIENT_INFO "%%b" goto :eof ) goto :eof :GET_ONE_CLIENT_INFO set CLIENT_INFO=%~1 for /F "delims=: tokens=1,2,3,4*" %%c in ( "%CLIENT_INFO%" ) do ( call :DO_ONE_CLIENT "%%c" "%%d" "%%e" "%%f" ) goto :eof :DO_ONE_CLIENT set CLIENT=%~1 set IPAddress=%~2 set UserName=%~3 set Password=%~4 echo ------------------------------- echo CLIENT=[%CLIENT%] echo IPAddress=[%IPAddress%] echo UserName=[%UserName%] echo Password=[%Password%] echo ------------------------------- goto :eof :end endlocal |
|
860) Re5:別のPCへのファイルコピー(ユーザ名、パスワードが異なる場合) ふぇむ 2003/11/13(木) 18:14 |
|
|
|
若干補足修正。 > for /F "usebackq tokens=*" %%b in ( `findstr /B "%CLIENT%" "%USERID_INI%"` ) do ( この findstr は、へんに部分一致しないよう、またもしかして %CLIENT% 中に空白文字が含まれていたり(ありえないか)した場合も考慮して、以下の形式の方がより堅実ですね。 findstr /B /C:"%CLIENT%:" "%USERID_INI%" |
|
861) Re6:別のPCへのファイルコピー(ユーザ名、パスワードが異なる場合) waruiko 2003/11/13(木) 19:34 |
|
|
|
ご親切にありがとうございます。 来週から早速作ってみます。 |
|
862) Re5:別のPCへのファイルコピー(ユーザ名、パスワードが異なる場合) ふぇむ 2003/11/14(金) 11:09 |
|
|
|
もう1つ修正します。 > for /F "delims=: tokens=1,2,3,4*" %%c in ( "%CLIENT_INFO%" ) do ( ここが若干意図どおりに動作していませんでした。 "delims=: tokens=1,2,3,4*" と書くと、4つ目の後でも一旦分解されてしまうようですね。 意図どおりに動かすには、こうでした。 "delims=: tokens=1,2,3,*" |
- ◆851. 別のPCへのファイルコピー(ユーザ名、パスワードが異なる場合) (waruiko)
2003/11/12(水) 16:13
- 852. Re:別のPCへのファイルコピー(ユーザ名、パスワードが異なる場合) (waruiko) 2003/11/12(水) 16:34
- 853. Re:別のPCへのファイルコピー(ユーザ名、パスワードが異なる場合) (ふぇむ)
2003/11/12(水) 17:49
- 854. Re2:別のPCへのファイルコピー(ユーザ名、パスワードが異なる場合) (waruiko)
2003/11/12(水) 20:17
- 857. Re3:別のPCへのファイルコピー(ユーザ名、パスワードが異なる場合) (ふぇむ)
2003/11/13(木) 05:08
- 859. Re4:別のPCへのファイルコピー(ユーザ名、パスワードが異なる場合) (ふぇむ)
2003/11/13(木) 15:25
- 860. Re5:別のPCへのファイルコピー(ユーザ名、パスワードが異なる場合) (ふぇむ)
2003/11/13(木) 18:14
- 861. Re6:別のPCへのファイルコピー(ユーザ名、パスワードが異なる場合) (waruiko) 2003/11/13(木) 19:34
- 862. Re5:別のPCへのファイルコピー(ユーザ名、パスワードが異なる場合) (ふぇむ) 2003/11/14(金) 11:09
- 860. Re5:別のPCへのファイルコピー(ユーザ名、パスワードが異なる場合) (ふぇむ)
2003/11/13(木) 18:14
- 859. Re4:別のPCへのファイルコピー(ユーザ名、パスワードが異なる場合) (ふぇむ)
2003/11/13(木) 15:25
- 857. Re3:別のPCへのファイルコピー(ユーザ名、パスワードが異なる場合) (ふぇむ)
2003/11/13(木) 05:08
- 854. Re2:別のPCへのファイルコピー(ユーザ名、パスワードが異なる場合) (waruiko)
2003/11/12(水) 20:17