web-dev-qa-db-ja.com

バッチファイルを使用してWindowsファイル名の1文字を置き換える方法は?

名前を変更する必要があるファイル名がたくさんあるWindows Server 2003サーバーがあります。基本的に、ファイル名のどこにあっても、すべての-(ハイフン)を_(アンダースコア)に置き換える必要があります。重複がないと仮定します。

小さなスクリプトでMacでこれを行うことができますが、ファイルが大きすぎてクレイジーなので、Macに転送して名前を変更してから、サーバーに戻ることができません。名前変更や追加のソフトウェアをダウンロードせずに、Windowsコマンドプロンプトでこれを行うことは可能ですか?

7
Matt Rogish

コマンドプロンプトから-すべてのファイルが同じディレクトリにあると仮定します。

一発ギャグ

for /f "tokens=* delims= " %i in ('dir /b "*.txt"') do Set LIST=%i& set LIST | ren "%~fi" "%LIST:-=_%"

これはコマンドプロンプトウィンドウごとに1つのショットであることに注意してください。つまり、何らかの理由でこれをキャンセルした場合は、別のコマンドプロンプトを開いて再度実行する必要があります。

11
Murdoch Ripper

ファイル名の1つの文字を別の文字に置き換えるバッチファイル

無料のGUIアプリを使用して手を握ることを検討してください: http://www.bulkrenameutility.co.uk/Main_Intro.php

バッチファイルを使用してこれを自分で行う必要がある場合は、非常に注意してください!バッチスクリプトには「元に戻す」ボタンがありません。 C:のような場所ですべてのファイルに再帰的に適用するbatスクリプトを実行すると、コンピューター上のすべてのファイルの名前が変更され、すぐに機能しなくなり、起動できなくなります。 OSを完全に再インストールする必要があります。 常にバックアップをとってください!

最初に、バッチファイルを単一のファイルで機能させるかどうかを決定する必要がありますか?ディレクトリ内のすべてのファイルを操作するには?または、再帰的に実行します(ディレクトリ内のすべてのファイル/フォルダ)。ここにいくつかのポインタがあります:

すべてのアンダースコア_を現在のディレクトリ内のすべてのファイルへの文字Mに置き換えるバッチファイル

これをchange_underscores_in_this_directory.batという名前のバッチファイルに入れます

@echo off
setlocal enabledelayedexpansion
for %%a in (*_*) do (
  set file=%%a
  ren "!file!" "!file:_=M!"
)

それを実行すると、そのディレクトリ内のアンダースコア付きのすべてのファイルが「M」に変更されます。

バッチファイルを使用してスペースを何も置換しない(スペースを削除する):

https://stackoverflow.com/questions/11270453/how-to-remove-spaces-from-file-names-in-bulk

バッチファイルを使用して、スペースをアンダースコアに置き換えます。再帰的に:

https://stackoverflow.com/questions/1613644/how-to-replace-names-recursively-via-windows-batch-operation

3
Eric Leschinski

それをstackoverflowで見つけました:

https://stackoverflow.com/questions/261515/batch-file-script-to-remove-special-characters-from-filenames-windows

Set fso = CreateObject("Scripting.FileSystemObject")
Set re  = New RegExp

re.Pattern = "[-]" ' put all characters that you want to strip inside the brackets'
re.IgnoreCase = True
re.Global = True

If WScript.Arguments.Unnamed.Count = 1 Then
  If fso.FolderExists(WScript.Arguments.Unnamed(0)) Then
    Recurse fso.GetFolder(WScript.Arguments.Unnamed(0))
  Else
    WScript.Echo "Folder not found."
  End If
Else
  WScript.Echo "Please give folder name as argument 1."
End If


Sub Recurse(f)
  For Each sf In f.SubFolders
    Recurse sf
     WScript.Echo sf.Name, " -> ", re.Replace(sf.Name, "_")
    sf.Name = re.Replace(sf.Name, "_")
  Next
  For Each sf In f.Files
     WScript.Echo sf.Name, " -> ", re.Replace(sf.Name, "_")

     If sf.Name <> re.Replace(sf.Name, "_" ) Then
       sf.Name = re.Replace(sf.Name, "_")
     End If
  Next
End Sub
2
Matt Rogish

別の解決策は、2つのバッチファイルを使用することです。

ファイル1:run_rn.bat:

forfiles /m "*.log" /c " cmd /c rn @file"

ファイル2:rn.bat:

set LIST1=%1
set LIST2=%LIST1:_=;%
ren %LIST1% %LIST2%

バッチファイルは、変更するファイルと同じディレクトリにある必要があります。

1
Vlad

12noonには無料のユーティリティがあり、正規表現を完全にサポートして大量のファイル名を変更できます。 ダウンロードへのリンクが記載された「NameTwister」情報ページ

私はこれを怒りで使ったことがありませんが、彼らの他のアプリ(特にディスプレイチェンジャー)を使って本当に幸せです。

0
AdamV