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

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

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

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

バッチファイル

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

Q&A

解決済

1回答

4915閲覧

batファイルで、パスにスペースを含むフォルダ配下でのコピー方法

Sans

総合スコア14

Windows

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

バッチファイル

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

0グッド

1クリップ

投稿2020/01/15 12:38

編集2020/01/19 04:16

前提・実現したいこと

言語:batファイル
環境:Windows10 64bit
フォルダ構成例:

src フォルダ   ・・・コピー元フォルダ |- test.bat    |- exclude.txt ・・・`bbb.csv`と書かれたファイル |- aaa.csv |- bbb.csv srcフォルダ    ・・・コピー元フォルダ(試験用。スペース無) |- exclude.txt ・・・`bbb.csv`と書かれたファイル(試験用。上記「src フォルダ」内と同一) dst フォルダ   ・・・コピー先フォルダ

実現したいこと:

  • フォルダ名に空白を含むフォルダ配下で、forfilesを使ってxcopyを行いたい
  • xcopyには/EXCLUDEオプションを指定したい
  • /XCLUDEオプション指定のパスにスペースを含むとエラーが出る
  • なお、xcopyのコピー先指定は「"""パス"""」とくくるとスペースを含んでいても成功した

該当のソースコード・試したこと

  • 以下該当コードでエラーとなる

エラー: 無効な引数またはオプションです - 'フォルダ\exclude.txt @file "C:\dst フォルダ" '

forfiles /p "C:\src フォルダ" /m *.csv /c "cmd /c xcopy /EXCLUDE:"C:\src フォルダ\exclude.txt" @file """C:\dst フォルダ""" "
  • EXCLUDEの指定先を検証用フォルダ(スペース無)とすると、エラーが起こらずコピーが実行される
forfiles /p "C:\src フォルダ" /m *.csv /c "cmd /c xcopy /EXCLUDE:"C:\srcフォルダ\exclude.txt" @file """C:\dst フォルダ""" "
  • 「batファイル エスケープシーケンス」で検索しヒットした、「^"」「"」などを試したがエラーとなった。

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

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

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

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

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

guest

回答1

0

ベストアンサー

案1:XCOPYをバッチファイルに入れて、
forfiles ~~~ /c "cmd /c xxxxx.bat @file"
とか。

案2:Cドライブならそのディレクトリに8.3名が付いているはずなので、dir /xで8.3名を調べてそれを使う。
(8.3名=長いファイル名や長い拡張子、または空白を含んだファイル名・ディレクトリ名に、8文字+3文字の別名を付けたもの)

投稿2020/01/20 16:10

otn

総合スコア84540

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

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

Sans

2020/01/21 16:46

ご回答いただきありがとうございました。 無事、案2でやりたい内容を実現できました。 以下は試した結果となります。 ---- 案1については、以下のような外部バッチファイル「test_xcopy.bat」を作成してみましたが、 残念ながらスペースを含むファイルを読み取れませんでした。 ``` rem test_xcopy.bat xcopy /EXCLUDE:%3 /y /k /g /r /h %1 %2 ``` ``` rem test.bat forfiles /p "C:\src フォルダ" /m *.csv /c "cmd /c xcopy.bat @file """C:\dst フォルダ""" """C:\src フォルダ\exclude.txt""" " ``` ``` rem エラー結果 C:\src フォルダ>xcopy "aaa.csv" "C:\dst フォルダ" /EXCLUDE:"C:\src フォルダ\exclude.txt" /y /k /g /r /h ファイルを読み取れません: "C:\src フォルダ\exclude.txt" ``` ---- 案2については、以下のようにtest.batを修正した結果、 無事/EXCLUDEオプションに、スペース含パスのファイルを指定できました。 ``` rem ※注意 rem 本batファイルは、ファイルシステム上で8.3形式のファイル名が生成できる必要があります。 rem コマンドプロンプトで`fsutil 8dot3name query`を実行し、設定値が「1 or 3(無効)」となっていないことを確認してください。 set SRCDIR="C:\src フォルダ" call :SHORTPATH %SRCDIR% set SRCDIR=%SHORTPATH% set DSTDIR="C:\dst フォルダ" call :SHORTPATH %DSTDIR% set DSTDIR=%SHORTPATH% set EXCLUDEPATH="C:\src フォルダ\exclude.txt" call :SHORTPATH %EXCLUDEPATH% set EXCLUDEPATH=%SHORTPATH% forfiles /p %SRCDIR% /m *.csv /c "cmd /c xcopy /EXCLUDE:%EXCLUDEPATH% @file %DSTDIR% " GOTO END rem 8.3形式のパスに変換する :SHORTPATH SET SHORTPATH=%~s1 EXIT /B :END
otn

2020/01/22 03:29 編集

案1: > forfiles ~~~ /c "cmd /c xxxxx.bat @file" と書いたのに、変に書き換えてますね。この意図は、空白を含んだパス名をBATファイルに閉じ込めることです。 コマンド: forfiles /p "C:\src フォルダ" /m *.csv /c "cmd /c my-xcopy.bat @file" my-xcopy.bat: xcopy /EXCLUDE:"C:\src フォルダ\exclude.txt" /y /k /g /r /h %1 "C:\dst フォルダ"
otn

2020/01/22 03:30

↑xcopyのオプションについては、チェックしてません。
Sans

2020/02/03 11:19

お返事が遅くなり、大変申し訳ございません。 返信に気づいておりませんでした。。。 追記いただいた案1を試してみましたが、 以下のような「ファイルを読み取れません」というエラーとなってしまいました。 ``` PS C:\src フォルダ> .\test.bat C:\src フォルダ>xcopy /EXCLUDE:"C:\src フォルダ\exclude.txt" /y /k /g /r /h "aaa.csv" "C:\dst フォルダ" ファイルを読み取れません: "C:\src フォルダ\exclude.txt" 0 個のファイルをコピーしました C:\src フォルダ>xcopy /EXCLUDE:"C:\src フォルダ\exclude.txt" /y /k /g /r /h "bbb.csv" "C:\dst フォルダ" ファイルを読み取れません: "C:\src フォルダ\exclude.txt" 0 個のファイルをコピーしました ``` また、xcopyのオプションについては、私の消し忘れです。。 今回の質問には影響しないと思いますので、 お気になさらないでください。
otn

2020/02/03 11:23

ファイルが無いということでは?ファイル名の間違い?
Sans

2020/02/03 13:25 編集

いいえ。ファイルはありました。 以下のようにmy-xcopy.batにIF EXISTでの判定を入れてみましたが、ファイルは見つかっております。 ``` rem my-xcopy.bat: IF EXIST "C:\src フォルダ\exclude.txt" ( echo "file exist" xcopy /EXCLUDE:"C:\src フォルダ\exclude.txt" /y /k /g /r /h %1 "C:\dst フォルダ" ) ELSE ( echo "not found" ) ``` 結果 ``` C:\src フォルダ>test.bat C:\src フォルダ>forfiles /p "C:\src フォルダ" /m *.csv /c "cmd /c my-xcopy.bat @file" C:\src フォルダ>IF EXIST "C:\src フォルダ\exclude.txt" ( echo "file exist" xcopy /EXCLUDE:"C:\src フォルダ\exclude.txt" /y /k /g /r /h "aaa.csv" "C:\dst フォルダ" ) ELSE (echo "not found" ) "file exist" ファイルを読み取れません: "C:\src フォルダ\exclude.txt" 0 個のファイルをコピーしました C:\src フォルダ>IF EXIST "C:\src フォルダ\exclude.txt" ( echo "file exist" xcopy /EXCLUDE:"C:\src フォルダ\exclude.txt" /y /k /g /r /h "bbb.csv" "C:\dst フォルダ" ) ELSE (echo "not found" ) "file exist" ファイルを読み取れません: "C:\src フォルダ\exclude.txt" 0 個のファイルをコピーしました ```
otn

2020/02/03 13:43

ということは、forfilesとか関係なく、そもそもexcludeのファイル名には空白を含んだファイル名が指定できないということですかね? であれば、案2以外だと、いったんそのファイルを空白を含まないファイル名にコピーしてから使うしかないと思います。
Sans

2020/02/03 14:38 編集

> ということは、forfilesとか関係なく、そもそもexcludeのファイル名には空白を含んだファイル名が指定できないということですかね? はい。少なくとも私が試した範囲では、空白を含んだファイル名はexcludeには指定できておりません。 > であれば、案2以外だと、いったんそのファイルを空白を含まないファイル名にコピーしてから使うしかないと思います。 なるほどですね。たしかにXCOPYだけなら空白を含む場所へ指定は可能です。 事前にEXCLUDEのファイルパスをチェックし、パスに空白を含んでいる場合は含まないような場所にコピーする、などの前処理を入れても良いかもしれません。 長くお付き合いいただき、誠にありがとうございました。 心から感謝申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問