MGreen
@MGreen (M Green)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

バッチファイルで、Net useとフォルダアドレスベタ打ち、何が違うか知りたい

バッチファイルで、Net useとフォルダアドレスベタ打ち、何が違うか知りたい

2024年10月7日追記:解決済
皆様回答ありがとうございます。

・常時ドライブマウントされたネットワークフォルダを見に行く場合でも、やはりNet useで認証するコマンドは入れたほうがよい。認証がPC再起動時など時々切れることもあるから。
・再起動時に自動で再度接続するには net use /user pw /persistent: yes のコマンドが使える
・いちいちアンマウントはしなくていいかも

ということがわかりました!初めての投稿でいろいろ教えていただき解決できて感謝です。


【背景】
PC(1)のフォルダs (Source) からPC(2)のフォルダd (Destination) に.txtファイルがあったらコピーするバッチコマンドを、PC(1)上に作りたいです。何秒かごとにTask schedulerで動かす予定です。
PC(1)からPC(2)の”d"フォルダにアクセスするには、最初はUser IDとPasswordを求められますが、一度アクセスしてしまえばコマンドにID/PWをいれなくても、あるいはnetuseコマンドを使わなくても、入れてしまうように見えます。

【質問】qi
ここで、net useコマンドによる「ドライブマウント」をバッチコマンドの中に入れたほうがよいか、不要かがわからず、どなたかご教示いただけると幸いです。

以下のコマンド例 AとBをご覧ください。


(A) 昔の同僚が提案してくれたコード:

set s=C:Source
set d=L:Desitination
set Drive="\\169.xxx.xxx.xxx\Destination"
set d_user="user"
set d_pass="password"

rem ドライブマウント
net use D: %Drive% /user:%d_user% %d_pass%

rem 3. Move file
if exist %s% move %s%\*.txt %d%\text.txt

rem 3. Drive unmount
net use D: /d /y

※所感:PC(2)のDestinationフォルダは、PC(1)から見ると既に常時にDドライブとしてマウントされていて、わざわざコマンドでnet useをする意味があまりわからない。


(B) 自分が考えるコード:

set s=C:\Source
set d=\\169.xxx.xxx.xxx\Destination
if exsit %s% copy %s%\*.txt %d%\test.txt

※所感:これでも十分動くのでこれで良い気がする。


目的の詳細:既存の(A)のようなコードを、さらに機能追加したい (さらに別の場所に、CopyだけではなくMoveも行うなど) ですが、元のAのコードもBのように作り変えてしまってもよいか、悩んでいます。

(A)のようなバッチファイルコマンドを作った同僚はもうやめてしまっていて、なぜnetuseコマンドを入れたのかもう聞けない状態です。

そもそも、Windowsのネットワークドライブにおいて、ドライブマウントのメリットが何なのかも、勉強不足であまりわかっておりません。(単に D: とか L: とかは、わかりやすいなとは思いますけど、システム上から考えると何がメリットなんだろう、と。)

以上、net useコマンドや、ドライブマウント、Windowsのバッチファイルコマンドに詳しい方がいましたら是非ご教示お願いします。

 

0

5Answer

(A)のようなバッチファイルコマンドを作った同僚はもうやめてしまっていて、なぜnetuseコマンドを入れたのかもう聞けない状態です。

本当の理由は作った人にしかわかりませんが

  • 処理の前に、確実にドライブをマウントしておきたかった
  • マウントする時のユーザーとパスワードも自動入力したかった(自分がいなくても処理が動くように)
  • 処理が終わったら、ドライブをアンマウントしておきたかった
  • PCを再起動しても変わりなく処理できるようにしたかった

という理由だと私は推測します。

Windowsのネットワークドライブにおいて、ドライブマウントのメリットが何なのかも

今の時代には、メリットは、ないかもしれません。

net useでD:とかL:にマウントする方法は、Windowsが登場する前のMS-DOS
の時代からある方法です。(LAN Managerというものです。)

\\169.xxx.xxx.xxx\Destination のような指定は(UNC:Universal Network Convention)といいますが、これが登場したのがWindows 95からです。
(とは言っても30年前)

古い時代に諸先輩たちが作ったバッチファイルの書き方を伝承しているために、この方法が使われているのかもしれません。

私にはわからない、他のメリットがあるのかもしれません。

1Like

Comments

  1. @MGreen

    Questioner

    ありがとうございます。PC再起動時に認証が切れる可能性があるということで、「ドライブマウント (DとかLとかにする)意味はよくわからないものの、ID/PWで認証作業は入れたほうがベター ということがわかり、コマンドにnet use /ID PW /persistent: yes を入れることができました!ユーザーが普段使うPCではないので、アンマウントはいらないと思い、コードから抜きました。大変勉強になりました。ありがとうございます。

※所感:これでも十分動くのでこれで良い気がする。

転ばぬ先の杖という言葉がありまして、自動で定期的動く処理は、想定される問題はできるだけ回避するように作っておくと幸せになれます。

すでにマウントされている状態で同じものをマウントしても問題が無いのであれば、入れておこうと思ったとしても不思議ではありません。

それがいやなら
・D: に目的のものがマウントされているかどうか確認する。
・マウントされていれば続行
・違うものがマウントされていれば、マウントを外す
・マウントされていなければマウントする
というような丁寧な処理にするのがいいのではないかと思います。

1Like

Comments

  1. @MGreen

    Questioner

    皆様おっしゃるように、マウントした認証情報は切れることがあるということがわかり、・既にマウントされていてもマウントしてもいいや ということで
    ・最初のほうにコマンドにnet use /ID PW /persistent: yes を入れる
    ・最後のアンマウントのコマンドは抜く
    という方針にしました!ご教示誠にありがとうございます。
    (既にマウントされたものを再びnet useしても問題がない(経験上) という前提で進めてますが、もし何か問題ありそうでしたら是非お知らせいただけたら大変うれしいです。。)

    ありがとうございました!

Aのコードは堅実な作りです。
元々バッチはUNCパスをサポートしていませんし、今でも一部のコマンドではサポートしていません。
場合によってユーザー認証を要求されることがありますから、UNCパスだけではどうすることもできません。
その問題にぶち当たったとき、このコードの価値が自然と分かるはずです。

できるならPowerShellに置き換えるのもありです。

1Like

Comments

  1. @MGreen

    Questioner

    バッチファイルはUNCパスをサポートしていなかった (一部今もしていない) というのを初めて知りました。そして皆様おっしゃるように再起動時など認証が切れることもあるのでドライブマウントはさておきID/PW認証は必ずいれたほうがよいだろうと思えました。まだPowershellに乗り換えるほどバッチコマンドを使いこなせていないですが、使っていってPSでないどできないことがでてきたら乗り換える日も来るかもしれません。

    大変勉強になりました。ありがとうございます!

(B) で良いと思います。

以下は補足

問題を切り分けます

  • 1: \\169.xxx.xxx.xxx\Destination にコピーしたい
  • 2: \\169.xxx.xxx.xxx\Destination に繋ぐための認証を自動化したい

1: をやるだけなら (B) で十分です。

問題は 2: ですね。認証が切れたときに (B) だけだと動作しません。

(A) の解法

2: の認証は net use により行えます。

で、(A) のコードは「毎回 net use やれば確実でしょ」としています。これは単純ですが、いちいちマウントとアンマウントのコマンドが入っていてノイジーです。

別の解法

基本的に (B) だけで運用し、認証が切れたときの再接続は別の手段で行います。

方法は色々あるでしょうが、たとえば net use の /persistent:yes オプションを使うと「認証した情報を永続的に保持」できます。一度実行さえしてしまえば、以後もう実行しなくても良くなると思います。

と、こんな感じで工夫できます。

※ちゃんとやりたいなら、net use による認証情報がいつ切れるかを調べた方が良いでしょう。そうすれば「切れないように永続的に保存してしまう」とか「切れたらまた手動で net use して認証し直す」といった対応を色々考えることができます。

1Like

Comments

  1. @MGreen

    Questioner

    ご教示ありがとうございます。
    いま自分で作ったテストコードを見たら、

    set d=L:\Destination
    のようになっていて、認証どころかフルパス指定もしていませんでした。確かにPC再起動時など認証情報切れたら危ない気がしてきました。ドライブマウントする必要ない気がするけど、認証は必要なので、net useは入れようと思います。

    認証について「認証」はしたほうがいいけど、「最後のアンマウントはする必要がなさそう」です。

    なのでpersistent/yesのオプションは調べてみて良さそうであれば使ってみようかと思います。

皆様、ご回答ありがとうございます!実はこれは私の人生初のQiita投稿で、ご回答嬉しく思います。
・net use はID/PW認証の意味ではいれたほうが無難そう
・ドライブマッピングのいみはよくわからない
という事がわかりました。

会社でnet use やったら逆にうまく動かなかったのですが、月曜以降、会社の環境で、もう少しいただいたアドバイスをもとに、改善してみます。

Qiitaの使い方がまだよくわかっていないのですが、どこかのタイミングでおそらく回答を締めなければなりませんね。。

1Like

Your answer might help someone💌