4

次の構造から、フォルダに含まれるファイルの名前を自動的に変更するバッチファイルを作成しようとしています:A12345678.textornumbers.textornumbers.txtより単純なもの:A12345678.txt

私はこのようなことを試みました:

@echo off
ECHO Renaming files
Pause
:begin
ECHO Renaming txt files
for /r %%x in (A*.*.*.txt) do (REN "%%x" A*.txt)
ECHO Renaming finished
:end
pause
done

エラーは返されませんが、何も返されません...

編集:

問題は別の方法で見られる可能性があります。最初の9文字と拡張子を残してファイルの名前を変更したいと思います。

私はここで同様の質問を見ました: ファイル名から文字を削除する

私はこれを持っているように私のケースに修正して調整しました:

@echo off
ECHO Renaming files
Pause
:begin
REM setlocal enabledelayedexpansion (the result is the same with and without this line)
set X=9
ECHO Renaming files
for /r %%f in (*.txt) do if %%f neq %~nx0 (
    set "filename=%%~nf"
    set "filename=!filename:~%X%,-%X%!"
    ren "%%f" "!filename!%%~xf")
ECHO Done
ECHO Processing finished
:end
pause
done

しかし、結果は次のとおりです。

Blockquote!filename!.txt

これはdirectoyの最初の画像用であり、他の画像にはエラー(このようなファイルはすでに存在します)です。

編集2:

インターネットで見つけた返信やその他の情報のおかげで、私が持っていた解決策は次のとおりです。ファイル名の最後の文字を削除します。最初の9文字を残したいからです。

@echo off
ECHO renaming files
ECHO.
Pause
:begin

set ext=QUB
set num=17
FOR /f "tokens=*" %%f in ('dir /b /a *.%ext%') do call :lab %%f
ECHO Done
pause
Exit

:lab
set original=
set original=%*
set newname=
call set newname=%%original:.%ext%=%%
call set newname=%%newname:~0,-%num%%%.%ext%
if "%newname%"==".%ext%" (goto :eof)
ren "%original%" "%newname%"
ECHO %newname%
goto :eof

これは私のコードではありませんが、他の人から使用したソリューションです(Carlitos.dllによる)。同様の問題を抱えている他の人にも役立つことを願っています。あなたのアイデアと助けてくれてありがとう!

4

3 に答える 3

4

スクリプトは何かをしますが、何も役に立ちません-各ファイルの名前を元の名前に変更します:-(

それはすべて、RENがワイルドカードをどのように処理するかについての規則と関係があります。RENがどのように機能するかについての適切な説明がどこにも投稿されているのを見たことがありません。それで、数週間前に私は大規模な実験を行い、観察したすべての行動を説明する一連のルールを開発しました。

私の結果は、WindowsのRENAMEコマンドがワイルドカードをどのように解釈するかで確認できます。StackExchangeスーパーユーザーサイト。

ターゲット名*をmanyに置き換えることで、問題を簡単に解決できます。の数が、処理する先頭の名前の最大長以上?であることを確認してください。また、値を変更しない場合は?、先頭を指定する必要はありません。A

for /r %%x in (A*.*.*.txt) do ren "%%x" ?????????????????????.txt

上記は、各ファイルを反復処理する必要があります。私はテストしていませんが、フォルダのみを繰り返す方が少し速いかもしれません

for /r /d %%x in (.) do ren "%%x\A*.*.*.txt" ?????????????????????.txt

の数を気にする必要がないように、FOR/Fを使用して名前を解析することもできます?

for /r %%x in (a*.*.*.txt) do (
  for /f "delims=." %%n in ("%%~nx") do ren "%%x" "%%n.txt"
)

改訂された質問に基づいて編集

.txt最初の9文字と拡張子までを単純に保持するには、解決策はさらに簡単です。9を使用するだけ?です。

for /r /d %%x in (.) do ren "%%x\*.txt" ?????????.txt

ファイルだけでなく、すべてのファイルの名前を変更する場合は.txt

for /r %%F in (*) do ren "%%F" "?????????%%~xF"
于 2012-10-05T11:48:23.340 に答える
0

次のようなこともできます。

for %%x in (*.textornumbers.txt) do (
  set nam=%%x
  if "!nam!" neq "!nam:.textornumbers=!" ren %%x !nam:.textornumbers=!
)
于 2012-10-07T07:57:35.033 に答える
0

-modifiersを使用~すると、次のことができます。

  1. 元のフルパスと名前(および拡張子)から名前だけを取得します。

    FOR /R %%A IN (A*.*.*.txt) DO (
      ... %%~nA ...
    )

    それはD:\path\A*.*.*.txtただのに変わりA*.*.*ます。

  2. #1の結果から名前だけを取ります。

    FOR /R %%A IN (A*.*.*.txt) DO (
      FOR %%B IN ("%%~nA") DO (
        ... %%~nB ...
      )
    )

    それはあなたに。を残しますA*.*

  3. #2から名前だけを取ります:

    FOR /R %%A IN (A*.*.*.txt) DO (
      FOR %%B IN ("%%~nA") DO (
        FOR %%C IN ("%%~nB") DO (
          ... %%~nC ...
        )
      )
    )

    それはあなたに与えるでしょうA*

  4. 元の名前から拡張子を抽出し、#3と連結します。これが最終的な名前になり、コマンドA*.txtに指定できるようになります。RENAME

    FOR /R %%A IN (A*.*.*.txt) DO (
      FOR %%B IN ("%%~nA") DO (
        FOR %%C IN ("%%~nB") DO (
          RENAME "%%A" "%%~nC%%~xA"
        )
      )
    )
于 2013-05-29T15:01:55.550 に答える