0

私はこれで頭がいっぱいです-すでに検索に時間がかかりすぎています-明らかに、CMD変数などの基本を理解していません-そして、いつもそのような頭痛の種になります

なぜこれがうまくいかないのですか?

for %a in (*) do ( set tmpx=%a & echo %tmpx% )

上記のコードは、他のスコープで %tmpx% の値を出力します - そしてそれは常に一定です

はい、setlocal ENABLEDELAYEDEXPANSION を実行します

基本的に、フォルダー内のすべてのファイルの単純な名前を、constantstring_somenameXX.tif から somenameXX.tif に変更する必要があります。つまり、constantstring=0000000005 です。

他の投稿では、 for ループ内の %a には特別な動作があり、そのままでは置換が機能しないことが正しく示唆されていたため、set を使用する必要がありました。

スクリプトや PowerShell を使用したくない - 使用しないことが不可能でない限り

ありがとうございました

4

2 に答える 2

3
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コマンドを削除してください。

于 2014-11-28T07:55:19.373 に答える