web-dev-qa-db-ja.com

変数のスペースをバッチで削除する

フォルダー内のファイル名からスペースを削除して、その結果を.txtファイル。 「エコーがオンです」という結果が表示されるだけです。何度も。

これは私がこれまでに持っているものです:

@echo ON
SET LOCAL EnableDelayedExpansion
For %%# in (*.*) do (
    SET var=%%~n#
    Set MyVar=%var%
    set MyVar=%MyVar: =%
    echo %MyVar%>>text.txt
)

誰かが何が悪いのか教えてもらえますか?

11
user2313522

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: =!にスキップできます。

9
user2033427

次の行でsetlocal enabledelayedexpansionを使用せずに、すべてのスペース(先頭と末尾だけでなく)を削除できます。

set var=%var: =%

これは、文字列内のすべてのスペースを空の文字列に置き換えることで機能します。

ソース: DOS-文字列操作

49
zr870

間違っているのは、変数の展開を有効にしていて(間違って書きました...)、それを使用していないため、enabledelayedexpansionを使用する場合は、変数名を次のように記述する必要があります。これ以外の場合:%Variable%

ただし、次のコードで使用する必要はありません。

@echo ON
For %%# in (*) do (
    SET "var=%%~n#"
    Call Set "MyVar=%%var: =%%"
    Call echo %%MyVar%%>>text.txt
)
1
ElektroStudios

名前を変更するファイルを含むフォルダーで次のバッチを実行します

    @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に追加するだけです

0
nfrignani