LoginSignup
dokimiki
@dokimiki (どきみき)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

バッチファイルで、パスに括弧が含まれるファイルをstartしたい

解決したいこと

あるバッチファイルから、ほかのバッチファイルを起動させるバッチを作っているのですが、
test(1).batなどの名前に()が含まれるファイルをstartできません。
解決方法を教えてください。

発生している問題・エラー

呼びだされた側のプロンプトに表示されているものです。

'test' is not recognized as an internal or external command,
operable program or batch file.

C:\Users\username\Desktop>

該当するソースコード

hoge.bat(呼びだす側)
start test(hoge).bat
test(hoge).bat(呼びだされる側)
pause

ファイル構造

.
├── hoge.bat
└── test(hoge).bat

自分で試したこと

ダブルクォーテーションでパスを囲みましたが、エラーは変わりませんでした。以下がそのソースコードです。

hoge.bat
start "title" "test(hoge).bat"

また、遅延環境変数を用いても、エラーは変わりませんでした。以下がそのソースコードです。

hoge.bat
@setlocal enabledelayedexpansion
set Path=test(hoge).bat
start "title" "!Path!"

遅延環境変数のダブルクォーテーションを付ける場所を変えても同じでした。

hoge.bat
@setlocal enabledelayedexpansion
set Path="test(hoge).bat"
start "title" !Path!

なぜかファイル名に空白が含まれている場合はちゃんと動きました。

hoge.bat(呼びだす側)
start "title" "test (hoge).bat"
test (hoge).bat(呼びだされる側)
pause

補足

以下のようにすれば動きますが、私はstartコマンドの/highや、/wait/minなどのオプションを使いたいので、できればstartをつかいたいです。

hoge.bat
"test(hoge).bat"
0

4Answer

hoge.bat~~ ~~start "title" "test (hoge).bat"~~ ~~
と半角スペースを入れてやればうまくいきます(むろんファイル名にも)。
↑すみません、ご自身で書かれていましたね、失礼しました。。。

どうやら半角スペースが入らないと、括弧の前のtestまでで解釈をやめ、test.batなりtest.exeなりを実行しようとするみたいですね。

微妙な違いはありますが、以下が近いかと:
https://qiita.com/yz2cm/items/8058d503a1b84688af09#%E3%83%90%E3%83%83%E3%83%81%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E7%B5%B6%E5%AF%BE%E3%83%91%E3%82%B9%E3%81%AB%E5%8D%8A%E8%A7%92%E9%96%8B%E3%81%8D%E3%82%AB%E3%83%83%E3%82%B3%E3%81%8C%E5%90%AB%E3%81%BE%E3%82%8C%E3%82%8B%E6%99%82%E3%81%AB%E7%99%BA%E7%94%9F%E3%81%99%E3%82%8B%E4%B8%8D%E5%85%B7%E5%90%88

半角スペース入れる対応ではダメなのですかね?
もしくは、括弧を使わないとか。。。

2

Comments

  1. @dokimiki

    Questioner

    回答ありがとうございます!

    どうやら半角スペースが入らないと、括弧の前のtestまでで解釈をやめ、test.batなりtest.exeなりを実行しようとするみたいですね。

    おっしゃる通りコマンドプロンプト側が途中で解釈をやめちゃってるみたいですね...
    image.png
    バッチファイルがstartするときに使っているコマンド引数をタスクマネージャーで覗いてみたのですが、やはり括弧が特別な記号として解釈されてそうですね...

    微妙な違いはありますが、以下が近いかと

    参考になります!
    やはりファイル名の(を消して解決するのが一番早いですかね...
    コマンドプロンプト側の処理だからっていうので納得するしかないですね(笑)

最終的にファイル名を変えることで解決することにしました!
回答していただいたお二方、( @HalHarada 様、 @imagou 様 )どうもありがとうございました!

2

Comments

  1. それが一番リーズナブルかと思います!

既に解決済みかもしれませんが、ダブルクォートを重ねると実行できたりします(理由は不明ですが・・・)。

start "title" ""test(hoge).bat""
2

Comments

  1. start 'title' 'test(hoge).bat'
    

    ダブルですか? シングルでは?
    windowsは?

  2. @dokimiki

    Questioner

    @mrbonjin さん、回答ありがとうございます!
    この方法なのですが、パスに空白があるときに何故か動かなくなってしまうんですよね、、、

  3. 脱windowsなので,バッチ,poweshellは御無沙汰で見当違いのレスポンスですみません。windowsはつくずく深いと感じています。

  4. パスに空白があるときに何故か動かなくなってしまうんですよね、、、

    少し試してみました。

    ファイル名に() パスに空白 囲み方
    × × "~" or なし
    × "~"
    × ""~""
    "~"

    ファイル名に()がある場合でもパスに空白が含む場合は囲み方を変えないとダメみたいですね😑。

  5. @dokimiki

    Questioner

    @mrbonjin さん、検証ありがとうございます!
    自分もいろいろ気になって調べたんですが、
    ファイル名に空白があればいいというcmd.exe特有のルールを利用して、
    "~ "という囲い方をすると空白と括弧がどんな状況でもいけるのでいいとおもいます!
    まとめた記事を書いてみたので、良かったら見てみてください!

()はファイル名に使えるようです。今日、重複ダウンロードで使っていました。
バッチファイルも使えそうです。

エスケープが必要なのでしょうか?

start "title" "test¥(hoge¥).bat"

因みに、全角と半角の()違いはないですよね。

type "test¥(hoge¥).bat"
dir  "test(hoge).bat"

もダメ?

1

Comments

  1. @dokimiki

    Questioner

    回答ありがとうございます!

    バックスラッシュ\でエスケープしようとすると、パス指定と解釈される(testフォルダの中の(hogeフォルダの中の).batファイル)ので、キャレット^でエスケープしてみたのですが、結果は同じでした...

    また、回答にある通りdirtypeで試すと普通にtest(hoge).batで指定できたので、startの時だけなのかな?と思っています。

  2. もう一丁
    バックスラッシュ\\でエスケープ
    では?

  3. @dokimiki

    Questioner

    返信ありがとうございます!

    hoge.bat
    start "title" "test\\(hoge\\).bat"
    

    で試したのですが、

    The system cannot find the file test\\(hoge\\).bat.
    

    というエラーが吐かれてしまいました...

  4. start に拘らず、call でバッチファイルの実行をお勧めします。

    最後に泣き1回!
    start はアプリ実行なのでバックスラッシュ\\\\でエスケープかも?

  5. @dokimiki

    Questioner

    返信ありがとうございます!

    start に拘らず、call でバッチファイルの実行をお勧めします。

    なるほど!callを使えばエラーなくいけたので、その改善も視野に入れようと思います!

    最後に泣き1回!
    start はアプリ実行なのでバックスラッシュ\\でエスケープかも?

    hoge.bat
    start "title" "test\\\\(hoge\\\\).bat"
    

    で試したのですが、

    The system cannot find the file test\\\\(hoge\\\\).bat.
    

    というエラーで終わってしまいました...
    根気づよく解決しようとして下さり、ありがとうございます!

Your answer might help someone💌