1

Windows XPを使用しており、tok.filenameをfilename.tokに移動するためのバッチファイルを作成する必要があります。を入力すると、これは1つのファイルに対して機能しますfix.bat tok.filename

set filename=%1
set newname=%filename:~4,45%
ren %1 %newname%.tok

を入力する必要がありますfix.bat tok*が、これtok*でファイル名が入力されます。

すべてのファイルを一度に1つずつファイル名に読み込むにはどうすればよいですか?

4

3 に答える 3

3

forステートメントを使用します。

setlocal enabledelayedexpansion

for %%i in (tok.*) do (
  set filename=%%i
  set newname=!filename:~4,45!
  ren %%i !newname!.tok
)

遅延拡張を有効にすると、変数が使用時に評価されるようになります。

forまたは、動作するバッチファイルが既にあるため、ステートメントを使用して、動作中のバッチファイルを呼び出す別のバッチファイルを作成できます。次のようになります。

for %%i in (tok.*) do call fix.bat %%i

または、次のようにコマンドラインから直接実行することもできます。

for %i in (tok.*) do call fix.bat %i
于 2012-09-25T21:08:57.543 に答える
2

バッチスクリプトは必要ありません

for %F in (tok.*) do for /f "delims=." %X in ("%~xF") do ren "%F" "%X.%~nF"

バッチスクリプト内で使用する場合は、パーセントを2倍にします。

ファイル名に複数のファイルが含まれている場合、上記の結果が得られない場合が.あります。

たとえば、tok.part1.part2になりpart2.tok.part1ます。

代わりに、必要に応じpart1.part2.tokて、次の簡単なスクリプトを使用できます。

@echo off
ren tok.* .*?.tok
for %%F in (.*.tok) do for /f "tokens=* delims=." %%A in ("%%F") do ren "%%F" "%%A"

その1番目のRENが2番目のスクリプトでどのように機能するかについては、「WindowsRENAMEコマンドがワイルドカードをどのように解釈するか」を参照してください。

あるべき時にのような名前tok..nameになるという難解な議論ができると思います。これは、次を使用して修正できます。name.tok.name.tok

@echo off
setlocal disableDelayedExpansion
ren tok.* .*?.tok
for %%F in (.*.tok) do (
  set "name=%%F"
  setlocal enableDelayedExpansion
  ren "!name!" "!name:~1!"
  endlocal
)

上記のソリューションの良いところは、「tok」の長さに依存しないことです。「tok」の代わりに任意の長さの文字列値を使用でき、コードも同様に機能します。

James Lソリューションは、一定の長さでうまく機能します。その解決策は少し改善することができます。

  • 部分文字列演算の2番目の引数は必要ありません。これを削除すると、元の完全な名前がどれだけ長くても、ソリューションが機能します。
  • 名前にが含まれていると、コードは失敗!します。遅延拡張のオンとオフを切り替えることで修正されました。
  • スペースまたは特殊文字の場合、ファイル名はRENステートメントで引用符で囲む必要があります

@echo off
setlocal disableDelayedExpansion
for %%i in (tok.*) do (
  set "filename=%%i"
  setlocal enableDelayedExpansion
  ren "!filename!" "!filename:~4!.tok"
  endlocal
)
于 2012-09-26T02:15:02.463 に答える
0

拡張を遅らせることなく同じことを行うこともできます(これは遅いです)。また、名前部分の長さを明示的に使用せずに、ドットが1つしかない場合。%〜nは拡張子なしのファイル名に展開され、%~ xは拡張子付きのドットに展開されます(したがって、ドットを拡張子付きで削除し:~1ます)。

また、forに%*を使用すると、任意の数の引数を渡すことができます。

そしてさらに。/ R bewteenforと%%I(を取得しますfor /R %%I)を追加すると、サブディレクトリにも再帰しま​​す。

バッチファイル全体:

for %%I IN (%*) do call :Rename "%~I"
exit /b

:Rename
    set newname=%~x1
    ren %1 "%~dp1%newname:~1%.%~n1"
exit /b
于 2013-12-20T11:38:06.097 に答える