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

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

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

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

バッチファイル

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

Q&A

解決済

1回答

411閲覧

バッチファイルの変数で!を含む値を格納したい

KEN1115

総合スコア22

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

バッチファイル

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

0グッド

0クリップ

投稿2023/09/18 13:20

実現したいこと

エクスプローラーの下記ファイルをダブルクリックで解凍できるようにしたい。
"J:\a\a\t!est.zip"

前提

.zipファイルは関連付けでダブルクリックで起動できる環境は整っているが、
ファイル名に!を含む場合、バッチファイルの変数の格納時点で!が無視されてしまい、解凍が失敗してしまう。

発生している問題・エラーメッセージ

"J:\a\a\t!est.zip"をダブルクリックの実行結果 J:\a\a>setlocal ENABLEDELAYEDEXPANSION  J:\a\a>rem === 実行中のバッチファイル自身の名前を取得 J:\a\a>set val= 解凍実行.bat J:\a\a>rem === 実行中のバッチファイル自身の引数を取得 J:\a\a>set val= "J:\a\a\t!est.zip" J:\a\a>rem === valを確認 J:\a\a>echo !val! "J:\a\a\test.zip" J:\a\a>rem === バッチから引数を与えてPowershellを実行 J:\a\a>powershell -file "J:\batch\h\gaibu\解凍実行.ps1" !val! rem ===(2) バッチから引数を与えてPowershellを実行 powershell -file "J:\batch\h\gaibu\解凍実行.ps1" !val! J:\a\a\test.zip パワーシェル引数:J:\a\a\test.zip

該当のソース

解凍実行.bat ========== rem @echo off setlocal ENABLEDELAYEDEXPANSION  rem === 実行中のバッチファイル自身の名前を取得 set val= %~nx0 rem === 実行中のバッチファイル自身の引数を取得 set val= %1 rem === valを確認 echo !val! rem === バッチから引数を与えてPowershellを実行 powershell -file "J:\batch\h\gaibu\解凍実行.ps1" !val! ========== 解凍実行.ps1 ========== function 解凍実行($x) { write-host "パワーシェル引数:$x" ※解凍に使用する命令は長いため省略 } 解凍実行 ==========

試したこと

ファイル名に!を含まないzipファイルであれば解凍は成功する
ファイル名に!を含むファイルの場合は!が無視されて実行される
batのechoで確認する限り、変数格納段階で!が無視されている

補足情報(FW/ツールのバージョンなど)

Windows10

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

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

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

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

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

guest

回答1

0

ベストアンサー

原因としては、setlocal ENABLEDELAYEDEXPANSIONとして、遅延環境変数展開を有効にしているので、!が特殊文字扱いになっているためです。遅延環境変数展開を有効にした場合に、!を処理対象にする方法は無いです。
文字列をバッチファイルに直接書く場合は、

CMD

1set val=t^^^!est 2echo !val!

と前にエスケープ記号の^を必要な個数だけ付ければ良いのですが(使い方によって3個とは限らない)、%0%1の値を使う場合はどうしようもない。

このケースでは簡単で、遅延環境変数展開を使う必要性は何処にもないので、それを止めて、普通の%での環境変数展開をすれば良いです。

CMD

1rem @echo off 2rem === 実行中のバッチファイル自身の名前を取得 3set val=%~nx0 4rem === 実行中のバッチファイル自身の引数を取得 5set val=%1 6rem === valを確認 7echo %val% 8 9rem === バッチから引数を与えてPowershellを実行 10powershell -file "J:\batch\h\gaibu\解凍実行.ps1" %val%

あと、変数が両方ともvalなのはテスト用に書き直したためかと思いますが、
set val= %~nx0のように=の後に空白を入れると、空白もデータの一部として変数にセットされます。
今回は、空白があっても無くても実行には影響しませんが、普通は影響すると考えた方が良いです。

さらに、set val = %~nx0のように=の前にも空白を入れるとそれも変数名の一部になるので、
展開のためには%val %と空白が必要です。変数名に空白が使える希有な言語。

ところで、

"J:\a\a\t!est.zip"をダブルクリックの実行結果

拡張子ZIPのファイルの関連付けをバッチファイル実行にしていると言うことですか?

投稿2023/09/18 14:04

otn

総合スコア86295

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

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

KEN1115

2023/09/18 21:17

回答ありがとうございます。 回答内容通りにコードを修正して無事に想定の動作を確認できました。 一部テスト用のコードが残っていた部分への丁寧な説明も大変参考になりました。 zipファイルの関連付けをバッチファイル実行にしております。(前提にその旨を記載したつもりでしたが、分かりづらくて申し訳ございません)
otn

2023/09/18 23:57

拡張子zipの関連付けをWindows標準の物から別の解凍ソフトに関連付けることはよくあるので、そういう事をしたのかと思っていました。まさかバッチに関連付けてるとは全く想像できません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問