質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

Q&A

解決済

4回答

13016閲覧

コマンドプロンプトではバッチファイルの保存場所は、処理に影響を与えますか?

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

0グッド

1クリップ

投稿2016/03/30 11:28

コマンドプロンプトではバッチファイルの保存場所は、処理に影響を与えますか?

robocopy "D:" "S:" /MIR

このようなコマンドを、robocopy.batというファイルに、実行します。実際はもう少しオプションを設定していますが、質問に関係ないところは、わかりやすさのため、省略しています。

robocopy.batをCドライブに置くと、うまくいきますが、robocopy.batをDドライブに置くと、うまくいきません。

たとえば、D:\test\test\robocopy.batというところに、robocopy.batをおくと、S:は、D:\test\test\だけがミラーリングさてしまいます。

Dドライブはrobocopy.bat自身が置いてあるフォルダだからだとは思うのですが、なぜこのようなことになるのでしょうか?

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

robocopyのヘルプを見ると

使用法:: ROBOCOPY コピー元 コピー先 [ファイル [ファイル]...][オプション]

コピー元 :: コピー元ディレクトリ (ドライブ:\パスまたは \サーバー\共有\パス)。
コピー先 :: コピー先ディレクトリ (ドライブ:\パスまたは \サーバー\共有\パス)。
ファイル :: コピーするファイル (名前/ワイルドカード: 既定値は「.」です)

となっています。なので、umed0025さんが書かれているようにドライブ名の後の""は省略してしまうとまずいのではないでしょうか。省略すると実行時のカレントディレクトリが指定されたものとしてコピーを始めるのだと思います。だからコピー先が"D:\test\test"の複製になってしまうのは正常な動作だと思います。

バッチファイルの置き場所が決まっていないのであれば、パスはフルパス指定(""を省略しない)した方がトラブルが少ないと思います。

投稿2016/03/30 13:50

KoichiSugiyama

総合スコア3041

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

robocopy "D:" "S:" /MIRは、Dドライブのカレントディレクトリ以下を、Sドライブのカレントディレクトリ以下にコピーすると言うコマンドなので、

D:\test\test\robocopy.batというところに、robocopy.batをおくと、

Dドライブのカレントディレクトリが、D:\test\test になりますので、そういう動作になります。
Dドライブ全体をコピーしたいのなら、robocopy "D:\" "S:\" /MIRです。

このようにすると、また別のエラーになります。

どんなエラーですか?

投稿2016/03/30 13:33

otn

総合スコア84555

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんにちは。

起動した時の各ドライブのカレント・ディレクトリはどのようになっていますか? これは起動方法によって異なります。
robocopy.batの頭に、cdcd D:の2行を加えてそれぞれのカレントを確認してみてください。
症状をみるかぎり、umed0025さんの言う通り、D:のrobocopy.batを起動した時のD:のカレントがD:\test\testになっていて、別のドライブのrobocopy.batを起動した時のD:のカレントがD:\になっている印象です。
対策はD:D:\へ変更することの筈です。S:側は変更しないでやってみてはどうでしょうか?

他にちょっと気になるのですが、robocopy.batが起動しいてるのがrobocopy.batでないことは確実ですか?
予想外にbatの方が起動することも良くあるのでexeと同じ名前のbatにはしない方が無用なトラブルに悩まないで済むこともあります。

投稿2016/03/30 13:29

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

ドライブ名を与えているため、ドライブ毎の現在のディレクトリが設定されいて、想定している動作とは食い違っているように見えます。
D:->D:\ S:->S:\では?

投稿2016/03/30 11:39

編集2016/03/30 11:43
umed0025

総合スコア851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/03/30 12:55

ありがとうございます。 D:->D:\ S:->S:\では? このようにすると、また別のエラーになります。詳しくありませんが、windowsのrobocopyはlinuxのrsyncとは違うようです。 自分自身を含むドライブではうまくミラーリングできないということが原因のような気がするのですが、よくわかりません。 ちなみに、実際はこのようなコマンドです。 robocopy "D:" "S:\D1" /DCOPY:DAT /COPY:DAT /MIR /XD "$RECYCLE.BIN" "System Volume Information"
退会済みユーザー

退会済みユーザー

2016/03/30 15:55

たくさんのご回答をありがとうございます。 実際にやってみて頂ければ、私と同じ結果になると思いますが、以下具体的なエラーです。 robocopy "D:\" "S:\D1" /DCOPY:DAT /COPY:DAT /MIR /XD "$RECYCLE.BIN" "System Volume Information" このようなコマンドなら、以下のようなエラーになります。 2016/03/31 00:15:29 エラー 123 (0x0000007B) コピー元ディレクトリにアクセスしています D:\" S:\D1 \DCOPY:DAT \COPY:DAT \MIR \XD $RECYCLE.BIN System\ ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。 robocopy "D:\" "S:\D1\" /DCOPY:DAT /COPY:DAT /MIR /XD "$RECYCLE.BIN" "System Volume Information" このようなコマンドなら、以下のようなエラーになります。 エラー: コピー先ディレクトリが指定されていません。 簡易な使用法 :: ROBOCOPY コピー元 コピー先 /MIR コピー元 :: コピー元ディレクトリ (ドライブ:\パスまたは \\サーバー \共有\パス)。 コピー先 :: コピー先ディレクトリ (ドライブ:\パスまたは \\サーバー \\共有\パス)。 /MIR :: 完全なディレクトリ ツリーをミラー化します。 詳細な使用方法については、ROBOCOPY /? を実行してください。 **** /MIR はファイルをコピーできるだけでなく、削除もできます。 とりあえず、C:\Program Files に置くと、うまくいきます。 robocopy.batではなく、robocopy D S.batなので、完全に同じ名前ではありません。 Microsoftの設計ミスなのでしょうか? C:\Program Files でもうまくいけばよいのですが、今後のことも考えて、原因を知っておきたいと思っています。 また、この原因がわからないと、C:\Program Files に置いといてとりあえずうまくいっていても、いずれ重大なエラーが起きたりするかもしれないと思っています。 よろしくお願いします。
退会済みユーザー

退会済みユーザー

2016/03/30 15:55

また、このようにやってもすべてうまくいきません。cd D:とcd D:\の違いもよくわかりません。 cd robocopy "D:" "S:\D1" /DCOPY:DAT /COPY:DAT /MIR /XD "$RECYCLE.BIN" "System Volume Information" cd D: robocopy "D:" "S:\D1" /DCOPY:DAT /COPY:DAT /MIR /XD "$RECYCLE.BIN" "System Volume Information" cd cd D: obocopy "D:" "S:\D1" /DCOPY:DAT /COPY:DAT /MIR /XD "$RECYCLE.BIN" "System Volume Information" よろしくお願いします。
退会済みユーザー

退会済みユーザー

2016/03/30 16:01

これもダメでした・・・ cd D:\ robocopy "D:\" "S:\D1" /DCOPY:DAT /COPY:DAT /MIR /XD "$RECYCLE.BIN" "System Volume Information" cd D:\ robocopy "D:\" "S:\D1\" /DCOPY:DAT /COPY:DAT /MIR /XD "$RECYCLE.BIN" "System Volume Information"
umed0025

2016/03/31 06:22 編集

robocopy D:\ "S:\D1" /DCOPY:DAT /COPY:DAT /MIR /XD "$RECYCLE.BIN" "System Volume Information" じゃない? パスが「ドライブ:\」のみの時、「"」でくくると誤動作するよう。 コピー元/コピー先に出力される文字列をみると正しくパスが認識されているかどうかはわかるかと。
退会済みユーザー

退会済みユーザー

2016/03/31 01:50

一見同じに見えるCD D:とCD D:\ですが,実は動きが違います. CDコマンドは cd /?でヘルプ取れますけど. CD D:\ … Dドライブのカレントディレクトリをルートにする CD D: … Dドライブのカレントディレクトリが ”どこかを表示する” です. あと,カレントディレクトリのほか,カレントドライブ,ということにも絡んでいるかもしれませんので, D: でカレントドライブを変更するか, CD /D D:\ と /D オプションにてドライブも変更する必要があるかもしれません. ごめんなさい,robocopyの方の動作は確認していません.
退会済みユーザー

退会済みユーザー

2016/03/31 04:58

ありがとうございます。 コマンドプロンプトはほとんど初めての初心者なので、調べながらやっています。 >パスが「ドライブ:\」のみの時、「"」でくくると謝動作するよう。 これをもう少し一般化して、こんな感じで考えてよいしょうか? \で終わる  →""なし \で終わらない→""あり また、何でこのような仕様になっているのでしょうか?エスケープとか関係してるんでしょうか? 以下は両方とも、Dドライブにおいても、動作しました。 robocopy D:\ "S:\D1" /DCOPY:DAT /COPY:DAT /MIR /XD "$RECYCLE.BIN" "System Volume Information" robocopy D:\ S:\D1\ /DCOPY:DAT /COPY:DAT /MIR /XD "$RECYCLE.BIN" "System Volume Information" よろしくお願いします。
umed0025

2016/03/31 06:21

[コマンド ライン リファレンス(日本語)](https://msdn.microsoft.com/ja-jp/library/cc785423(v=ws.10).aspx)で、パスに対する「”」でくくることへの明確な記述がないため、 パスに空白が入る場合、二重引用符`"`でパスをくくくるという処理が一般的ではあるが、Windowsが提供するexe全てに共通する仕様とは言い切れないように思います。 ただ、解釈については個別のexeに委ねらているため今回のような意図せぬ動きとなったように思います(「"D:\"」と指定するとエラーとなる。)。 そもそもrobocopyのヘルプから読み解くと、「ドライブ:\パスまたは \\サーバー\共有\パス」となっている時点で、「ドライブ:」「ドライブ:\」といった指定の仕方は想定していないのかもしれません。
退会済みユーザー

退会済みユーザー

2016/03/31 10:29

ありがとうございました。 時間がかかりましたが、ほとんど触ったことがなかったコマンドに対して、少しは理解することができました。
退会済みユーザー

退会済みユーザー

2016/04/01 02:24

追伸ですが・・・ 理由がいまいちわkらなかったので、もう少し調べていました。 このようにしたら、うまくいきました。 robocopy "D:\\" "S:\D1" /DCOPY:DAT /COPY:DAT /MIR /XD "$RECYCLE.BIN" "System Volume Information" 私の能力では、正しく判断できないのですが、これでよいのでしょうか? 猫科研究所 - コマンドプロンプトのエスケープ仕様 http://up-cat.net/%25A5%25B3%25A5%25DE%25A5%25F3%25A5%25C9%25A5%25D7%25A5%25ED%25A5%25F3%25A5%25D7%25A5%25C8%25A4%25CE%25A5%25A8%25A5%25B9%25A5%25B1%25A1%25BC%25A5%25D7%25BB%25C5%25CD%25CD.html わかりづらい書き方だが、要は以下の通り。 キャレット「^」は何の特別な意味もない。 空白を含む引数はエスケープ文字としての二重引用符「"」で囲うこと。 二重引用符「"」自体を引数(データ)に含めたい場合は「\」を前に付けること。 二重引用符の前にデータとして「\」を付けたい場合、「\」を2回以上つけるが… この場合、2つの「\\」が1つの「\」に置き換わるように動作する。 例えば「\\"」は2つの「\」が1つの「\」に置き換えられ、残りの「"」はエスケープ文字になる。 例えば「\\\"」は2つの「\」が1つの「\」に置き換えられ、残りの「\"」がデータとしての「"」になる。 つまり、最後の「"」はその前の「\」が奇数個ではデータになり、偶数個ではエスケープ文字になる。 上記以外の「\」は単なるデータの「\」になる。 というわけで、「"」をデータとして含めたいときはその前にエスケープ文字「\」を置き、その前にさらにデータとしての「\」を起きたい場合は2個ずつセットで置く(合計で奇数個の「\」が続く)ようにすればよい。 まぁ、「"」の前にどうしても「\」を置きたいケースはそれほど多くない気がするので、あまり気にする必要はなさそう。 この最後の一行が今回のケースだったのでしょうか?
退会済みユーザー

退会済みユーザー

2016/04/01 02:41

C言語などで見かけるエスケープシーケンスの理屈から言えば \\ → \ \" → " なので, "D:\" → D:" と解釈されても不思議ではないですね
退会済みユーザー

退会済みユーザー

2016/04/01 02:53 編集

もう一点ものすごく気になることなのですが、自分自身を処理するスクリプトは、できる限り避けたほうが良いのでしょうか? また、どのような理由でしょうか? 今回のコードをrobocopy_test.batに記述するとします。robocopy_test.batを置くディレクトリによっては、robocopy_test.bat自身が、robocopy_test.batをコピーしていることになります。 最後になると思いますが、よろしくお願いします。 追伸 このサイトで質問を終了するということはできないのでしょうか?ベストアンサーを選んでも、「コメントを投稿する」ことは永遠にできるのでしょうか?
退会済みユーザー

退会済みユーザー

2016/04/01 08:26

質問をクローズする機能は見たことがないので多分出来ないかも ↑の質問を別問い合わせをすれば自然とそちらに向かうのでは?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問