フォルダー内のファイル名からスペースを削除して、その結果を.txt
ファイル。 「エコーがオンです」という結果が表示されるだけです。何度も。
これは私がこれまでに持っているものです:
@echo ON
SET LOCAL EnableDelayedExpansion
For %%# in (*.*) do (
SET var=%%~n#
Set MyVar=%var%
set MyVar=%MyVar: =%
echo %MyVar%>>text.txt
)
誰かが何が悪いのか教えてもらえますか?
ECHO is on.
を取得する理由は、遅延拡張が使用されなかったためです。これにより、for
コマンドが実行される前に%var%
および%MyVar%
の値が挿入されました。開始時に定義されていないため、空の変数が挿入されました。echo %MyVar%>>text.txt
を実行すると、echo >>text.txt
として解釈されました。引数なしでechoを実行すると、echoがオンかオフかが出力されます。これがtext.txt
で得られるものです。
この問題を解決するには、次の2つのことを行う必要があります。
まず、2行目に問題があります。 setlocal
のセットとローカルの間にスペースはありません。 2行目はSETLOCAL EnableDelayedExpansion
である必要があります。
次に、遅延展開を使用するには、各変数のすべての%
を!
のように!var!
のように%var%
に置き換える必要があります。
最終結果:
@echo ON
SETLOCAL EnableDelayedExpansion
For %%# in (*.*) do (
SET var=%%~n#
Set MyVar=!var!
set MyVar=!MyVar: =!
echo !MyVar!>>text.txt
)
この場合、実際には一時変数を使用する必要はありません。SET MyVar=%%~n#
を実行してset MyVar=!MyVar: =!
にスキップできます。
次の行でsetlocal enabledelayedexpansion
を使用せずに、すべてのスペース(先頭と末尾だけでなく)を削除できます。
set var=%var: =%
これは、文字列内のすべてのスペースを空の文字列に置き換えることで機能します。
ソース: DOS-文字列操作
間違っているのは、変数の展開を有効にしていて(間違って書きました...)、それを使用していないため、enabledelayedexpansionを使用する場合は、変数名を次のように記述する必要があります。これ以外の場合:%Variable%
ただし、次のコードで使用する必要はありません。
@echo ON
For %%# in (*) do (
SET "var=%%~n#"
Call Set "MyVar=%%var: =%%"
Call echo %%MyVar%%>>text.txt
)
名前を変更するファイルを含むフォルダーで次のバッチを実行します
@echo off
setlocal enabledelayedexpansion
for %%j in (*.*) do (
set filename=%%~nj
set filename=!filename=.=_!
set filename=!filename= =_!
if not "!filename!"=="%%~nj" ren "%%j" "!filename!%%~xj"
)
印刷をtxtに追加するだけです