2013-05-19 19 views

答えて

69

DOSプロンプトでよりスマートに行うには、PowerShellを使用します。ここでは、スペースを含むカレントディレクトリ内のすべてのファイルとディレクトリの名前を一括して一括して名前を変更して、_のアンダースコアに置き換える方法を示しました。

Dir | 
Rename-Item -NewName { $_.Name -replace " ","_" } 

EDIT:
任意に、Where-Objectコマンド(コマンドレット)連続レット対象外オブジェクト外フィルタに使用することができます。

  • はディレクトリのみを処理するには、任意のドキュメントファイル

    Dir | 
    Where-Object { $_.Name -notmatch "\.(doc|xls|ppt)x?$" } | 
    Rename-Item -NewName { $_.Name -replace " ","_" } 
    
  • をスキップする(前の3.0バージョン)

    Dir | 
    Where-Object { $_.Mode -match "^d" } | 
    Rename-Item -NewName { $_.Name -replace " ","_" } 
    
    :以下は、それはあなたが余裕ができる柔軟性を説明するためにいくつかの例であり、

    PowerShell v3.0に新しいDirフラグが導入されました。そこにDir -Directoryを使用することもできます。特定の文字を削除したり、名前を変更するには、既にアンダースコア(もしくは他の文字)を含む任意のファイルをスキップするには

  • Dir | 
    Where-Object { -not $_.Name.Contains("_") } | 
    Rename-Item -NewName { $_.Name -replace " ","_" } 
    
+0

。 [aphoe答え](http://stackoverflow.com/a/23555996/1275574) 'Where-Object'なしで同じことを実行してください – AminM

+1

@JesonParkこれを指摘してくれてありがとう。 'Where-Object'の使い方についていくつかの例を追加しました。 –

+3

Rename-Item:送信元と送信先のパスが異なる必要があります。エラー:/ –

-2

この場合、renameコマンドをお勧めします。詳細については、コマンドラインで「ren /?」と入力してください。

6

このバッチファイルは役に立ちますが、いくつかの制限があります。 filename =と%は置き換えることができません(ここのメモリから)。ファイル名の^も問題になります。それは文字の束はアンダースコアで置き換えられるしようとしている立っているように=後の文字で:後に文字を置き換え下部ブロック内のすべての行に、この部分%newname: =_%

echoを削除するとrenコマンドが有効になります。これは、単にコンソールウィンドウにコマンドを出力するためです。

/sをDIRコマンドの部分に追加しないと、カレントフォルダの下のすべてのフォルダも処理されます。

特定の文字を削除するには、=記号の後にある文字を削除します。 %newname:z=%のように、すべてのz文字が削除されます(大文字と小文字は区別されません)。

@echo off 
for /f "delims=" %%a in ('dir /a:-d /o:n /b') do call :next "%%a" 
pause 
GOTO:EOF 
:next 
set "newname=%~nx1" 

set "newname=%newname: =_%" 
set "newname=%newname:)=_%" 
set "newname=%newname:(=_%" 
set "newname=%newname:&=_%" 
set "newname=%newname:^=_%" 
set "newname=%newname:$=_%" 
set "newname=%newname:#=_%" 
set "newname=%newname:@=_%" 
set "newname=%newname:!=_%" 
set "newname=%newname:-=_%" 
set "newname=%newname:+=_%" 
set "newname=%newname:}=_%" 
set "newname=%newname:{=_%" 
set "newname=%newname:]=_%" 
set "newname=%newname:[=_%" 
set "newname=%newname:;=_%" 
set "newname=%newname:'=_%" 
set "newname=%newname:`=_%" 
set "newname=%newname:,=_%" 

echo ren %1 "%newname% 
26

のWindows PowerShellのワンライナーコマンドは以下のようになります。(ここでは空白はアンダースコアに置き換えられている)

Dir | Rename-Item –NewName { $_.name –replace " ","_" } 
+0

フォルダ内のたくさんのファイルの名前をすばやく変更できました。ありがとうございました! – abjbhat

+0

助けてくれてうれしいです。 – aphoe

+2

Rename-Item:送信元と送信先のパスが異なる必要があります。エラー:/ –

6

PowerShellの答えは良いですが、あなたのすべてのファイルが(彼らに不要な文字を持っていない限り、名前の変更-Itemコマンドは、同じターゲットディレクトリでは動作しません。重複が見つかると失敗します)。あなたが私に似ているといい名前と悪い名前のミックスを持っていた場合

、(アンダースコアとスペースに置き換えられます)の代わりにこのスクリプトを試してください: `どこ-Object`の使用が何であるかを

Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace(" ", "_") } 
+0

この解決法は私のために働いていました(答えが受け入れられるとエラーが発生するため、言及したように、置き換えられる文字が含まれていないファイルがいくつかあると思われます)。 +1、この文脈では、 '-Recurse'フラグと' Move-Item'コマンドについてもう少し説明するのはすばらしいことです。 – j4v1

関連する問題