for %a in (*) do ( set tmpx=%a & echo %tmpx% )
前のコードの問題は展開の遅延です。はい、有効にしましたが、使用していません。有効にした方法によっては、機能しません
ではcmd
、行または行のブロック (括弧内のコード) に到達すると、最初に解析されてから実行されます。解析段階では、変数の読み取り操作がコマンドから削除され、コマンドの実行が開始される前に変数の値に置き換えられます。したがって、行/ブロック内の変数の値を変更すると、変数の読み取りがないため、同じ行/ブロック内の変更された値を取得できません (それらは置き換えられました)。
setlocal enabledelayedexpansion
(必要に応じて) 変数の読み取り構文を から に置き換えることができます%var%
。!var!
これは、読み取り操作が実行フェーズまで遅延されることをパーサーに示します。
したがって、あなたの場合、コードは次のようになるはずです
setlocal enabledelayedexpansion & for %a in (*) do ( set "tmpx=%a" & echo !tmpx! )
しかし、これは機能しません (デフォルトで構成された環境では)。
cmd
には、バッチ ファイルとコマンド ラインの 2 つの実行モードがあります。あなたの場合、コマンドラインを使用しており(for
ループでパーセント記号をエスケープしていません)、コマンドラインモードでは機能しsetlocal enabledelayedexpansion
ません。これはバッチ ファイル用です (「 」を参照setlocal /?
) 。
コマンドラインから動作させるにはどうすればよいですか? デフォルトcmd
では、遅延展開が無効になった状態で開始され、バッチ ファイル内にない場合は有効にできません。ただしcmd
、遅延拡張を有効にして開始し、この開始されたインスタンスでコマンドを実行できます (「 」を参照cmd /?
) 。
cmd /v:on /c "for %a in (*) do ( set "tmpx=%a" & echo !tmpx! )"
とにかく、名前変更の問題を解決するために、遅延拡張は必要ありません
for %a in (*_*.tif) do for /f "tokens=1,* delims=_" %b in ("%~nxa") do echo ren "%a" "%c"
つまりtif
、アンダースコアを持つ各ファイルについて、ファイルの名前と拡張子 ( %~nxa
) を文字列として取得し、アンダースコアをトークン間の区切り文字として使用して、最初のトークン (最初のアンダースコアの左側のテキスト) を取得します。%b
残りのテキスト (アンダースコアの右側) を%c
. ここで、元のファイル名 (に格納されている) の名前を (アンダースコアの右側のテキスト%a
) の内容に変更するだけです。%c
このコードでは、名前変更操作はコンソールにのみエコーされます。出力が正しい場合は、echo
コマンドを削除してください。