いくつかのバッチ ファイルに次のような行があります。
FOR %%f IN (%*) DO something.exe %%f
私は長い間、何の問題もなく使用してきました。最近、ハード ドライブを交換する必要があり、私が知る限りでは以前と同じように Windows 7 を再インストールしました。現在、このような行を含むバッチ ファイルを実行すると、"%*" が事前処理されません。そのため、"XXX.bat *.txt" のようなファイルでは、次のようになります。
入力ファイル「*.txt」を開けません
違いがあるかどうかはわかりませんが、私は Parallels で仮想マシンとして Windows 7 を実行しています。バージョン 8 から 10 にアップグレードしました。また、Mac OS も Mountain Lion から Yosemite にアップグレードしました。
さらに奇妙なことに、この小さなバッチファイルは正常に動作します。
@ECHO off
FOR %%f IN (%*) DO start gvim %%f
しかし、次の例では、t? が見つからないというメッセージが表示されます (t? は t1、t2、および t3 に解析されるはずです)。
@ECHO off
FOR %%f IN (%*) DO af2.exe %%f
そして、それに「start」を追加してみましたが、結果は同じでした。
もっと簡単に言うと次のようになります。
これは機能します:
af2 2014A 2014B 2014C
しかしこれは:
af2 2014?
「2014?」というファイルにアクセスしようとするとエラーが発生します。
そして、af2 は、ファイルごとに、私が作成し、20 年以上使用してきた、ファイルに関するいくつかの統計情報を提供するプログラムを呼び出します。
答え1
コマンド拡張は何らかの理由で無効になっています。コマンド拡張は、コマンドライン引数(パラメータ)に従ってCALL /?
。
ただし、次の抜粋にはCMD /?
いくつかの解決のヒントが示されています。
コマンド拡張機能は、デフォルトで有効になっています。スイッチを使用して、特定の呼び出しに対して拡張機能を無効にすることもできます。を使用してレジストリで 次のいずれかまたは両方の値を設定すると、マシンおよび/またはユーザー ログオン セッション上の の
/E:OFF
すべての呼び出しに対して拡張機能を有効または無効にできます。CMD.EXE
REG_DWORD
REGEDIT.EXE
HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\EnableExtensions
および/または
HKEY_CURRENT_USER\Software\Microsoft\Command Processor\EnableExtensions
0x1
またはのいずれかに設定します0x0
。ユーザー固有の設定はマシンの設定よりも優先されます。コマンド ライン スイッチはレジストリ設定よりも優先されます。バッチ ファイルでは、
SETLOCAL ENABLEEXTENSIONS
or 引数がor スイッチDISABLEEXTENSIONS
よりも優先されます。詳細については、 を参照してください。/E:ON
/E:OFF
SETLOCAL /?
例
==>type D:\bat\cliParser.bat
@echo OFF >NUL
echo all %%* = %*
set /A "ii=0"
:loopfor
echo param %%%ii% = %0
SHIFT
set /A "ii+=1"
if not [%0]==[] goto :loopfor
goto :eof
==>D:\bat\cliParser.bat aaa bbb
all %* = aaa bbb
param %0 = D:\bat\cliParser.bat
param %1 = aaa
param %2 = bbb
==>cmd /E:OFF /C D:\bat\cliParser.bat aaa bbb
all %* = *
The syntax of the command is incorrect.
param %3 = D:\bat\cliParser.bat
The syntax of the command is incorrect.
param %3 = aaa
The syntax of the command is incorrect.
param %3 = bbb
The syntax of the command is incorrect.
The system cannot find the batch label specified - eof
==>
答え2
問題が分かりました。デスクトップに、私が書いたプログラムの .exe ファイルがたくさんあるフォルダがあります。また、いくつかの .bat ファイルがあるフォルダもあります。多くの場合、.bat ファイルは、同じルート名を持つ .exe ファイルの 1 つを呼び出します (af2.bat は af2.exe を呼び出します)。これで問題なく動作します。もし.bat ファイルを含むフォルダーは、PATH 変数内の他のフォルダーよりも前になります。これは、以前のインストールでもそうでした (そして、今回のインストールでもそうです)。
そういう微妙な小さな問題を愛さなければなりません。
ご意見ありがとうございました。:)