これらのルールは、Vistaマシンでの広範なテストの後に発見されました。ファイル名にUnicodeを使用したテストは行われていません。
RENAMEには、sourceMaskとそれに続くtargetMaskという2つのパラメーターが必要です。sourceMaskとtargetMaskの両方が含まれていることができ*
、および/または?
ワイルドカード。ワイルドカードの動作は、ソースマスクとターゲットマスクの間でわずかに変化します。
注意 - RENは、フォルダの名前を変更するために使用することができますが、ワイルドカードはされていないフォルダ名を変更する場合sourceMaskまたはtargetMaskのいずれかで許可さ。sourceMaskが少なくとも1つのファイルと一致する場合、ファイルの名前が変更され、フォルダーは無視されます。sourceMaskがフォルダーではなくファイルのみに一致する場合、ワイルドカードがソースまたはターゲットに表示されると構文エラーが生成されます。sourceMaskが何にも一致しない場合、「ファイルが見つかりません」というエラーが発生します。
また、ファイルの名前を変更する場合、ワイルドカードはsourceMaskのファイル名部分でのみ許可されます。ファイル名に至るまでのパスにワイルドカードは使用できません。
sourceMask
sourceMaskは、名前を変更するファイルを決定するフィルターとして機能します。ワイルドカードは、ファイル名をフィルタリングする他のコマンドと同じように機能します。
ワイルドカード以外のすべての文字は、いくつかの特殊なケースの例外を除き、自分自身と一致する必要があります。
.
-それ自体と一致するか、文字が残っていない場合は名前の末尾と一致します(何もない)。(注-有効なWindows名はで終わることはできません.
)
{space}
-それ自体と一致するか、文字が残っていない場合は名前の末尾と一致します(何もない)。(注-有効なWindows名はで終わることはできません{space}
)
*.
終わりに-任意の0個以上の文字にマッチ除く .
終端は.
、実際の任意の組み合わせを使用できます.
し、{space}
限りマスクの非常に最後の文字があるとして.
これが唯一の例外で*
、単に任意の文字セットと一致していません。
上記の規則はそれほど複雑ではありません。しかし、状況を混乱させるもう1つの非常に重要なルールがあります。sourceMaskは、長い名前と短い8.3名(存在する場合)の両方と比較されます。この最後のルールにより、マスクが短い名前で一致する場合は常に明らかではないため、結果の解釈が非常に難しくなります。
RegEditを使用して、NTFSボリュームでの短い8.3形式の名前の生成を無効にすることができます。この時点では、ファイルマスクの結果の解釈ははるかに簡単です。ショートネームを無効にする前に生成されたショートネームは残ります。
targetMask
注-厳密なテストは行っていませんが、COPYコマンドのターゲット名にも同じルールが適用されるようです
targetMaskは新しい名前を指定します。これは常に完全な長い名前に適用されます。sourceMaskが短い8.3名に一致した場合でも、targetMaskが短い8.3名に適用されることはありません。
sourceMaskでのワイルドカードの有無は、targetMaskでのワイルドカードの処理方法に影響を与えません。
以下の議論では- c
ではない任意の文字を表し*
、?
または.
targetMaskはソース名に対して厳密に左から右に処理され、バックトラッキングは行われません。
c
-次の文字がターゲット名にない限り、ソース名内の位置を進め、ターゲット名に.
追加c
します。(ソースにあった文字をで置き換えますc
が、決して置き換えません.
)
?
-ソースの長い名前の次の文字に一致し、次の文字がそうでない限りターゲット名に追加します。次の文字がある.
場合、.
またはソース名の最後にある場合、結果と現在のソース名内の位置は変更されません。
*
targetMaskの最後-残りのすべての文字をソースからターゲットに追加します。すでにソースの最後にある場合、何もしません。
*c
-現在の位置からc
(大文字と小文字を区別する貪欲な一致)の最後の出現までのすべてのソース文字に一致し、一致した文字セットをターゲット名に追加します。c
が見つからない場合、ソースからの残りのすべての文字が追加され、その後にc
これがWindowsファイルのパターンマッチングで大文字と小文字が区別される唯一の状況です。
*.
-現在の位置から最後の出現.
(貪欲な一致)までのすべてのソース文字に一致し、一致した文字セットをターゲット名に追加します。.
が見つからない場合、ソースからの残りのすべての文字が追加され、その後に.
*?
-残りのすべての文字をソースからターゲットに追加します。すでにソースの最後にある場合は何もしません。
.
*
最前面なし- 文字をコピーせずに最初の出現までソース内の位置を進め、ターゲット名に.
追加.
します。.
ソースで見つからない場合は、ソースの最後に進み.
、ターゲット名に追加します。
targetMaskが枯渇した後、任意の末尾.
とは{space}
、Windowsのファイル名はで終わることができないので、結果としてターゲット名の末尾をオフにトリミングされています.
か{space}
いくつかの実用的な例
拡張子の1番目と3番目の位置にある文字を置き換えます(まだ存在しない場合は2番目または3番目の文字を追加します)
ren * A?Z*
1 -> AZ
12 -> A2Z
1.txt -> AZ.txt
12.txt -> A2Z.txt
123 -> A2Z
123.txt -> A2Z.txt
1234 -> A2Z4
1234.txt -> A2Z4.txt
すべてのファイルの(最終)拡張子を変更する
ren * *.txt
a -> a.txt
b.dat -> b.txt
c.x.y -> c.x.txt
すべてのファイルに拡張子を追加します
ren * *?.bak
a -> a.bak
b.dat -> b.dat.bak
c.x.y -> c.x.y.bak
最初の拡張子の後に余分な拡張子を削除します。?
完全な既存の名前と初期拡張子を保持するには、十分なものを使用する必要があることに注意してください。
ren * ?????.?????
a -> a
a.b -> a.b
a.b.c -> a.b
part1.part2.part3 -> part1.part2
123456.123456.123456 -> 12345.12345 (note truncated name and extension because not enough `?` were used)
上記と同じですが、切り捨てられないように、5文字より長い初期名または拡張子を持つファイルを除外します。(明らかに?
、ターゲットマスクの両端に追加を追加して、最大6文字までの名前と拡張子を保持できます)
ren ?????.?????.* ?????.?????
a -> a
a.b -> a.b
a.b.c -> a.b
part1.part2.part3 -> part1.part2
123456.123456.123456 (Not renamed because doesn't match sourceMask)
_
名前の最後の文字を変更し、拡張子を保持しようとします。(_
拡張機能に表示されている場合、正常に動作しません)
ren *_* *_NEW.*
abcd_12345.txt -> abcd_NEW.txt
abc_newt_1.dat -> abc_newt_NEW.dat
abcdef.jpg (Not renamed because doesn't match sourceMask)
abcd_123.a_b -> abcd_123.a_NEW (not desired, but no simple RENAME form will work in this case)
任意の名前は、文字で区切られたコンポーネントに分割でき.
、各コンポーネントの末尾からのみ追加または削除できます。文字をコンポーネントの先頭または中央から削除したり追加したりすることはできませんが、残りはワイルドカードで保持されます。置換はどこでも許可されています。
ren ??????.??????.?????? ?x.????999.*rForTheCourse
part1.part2 -> px.part999.rForTheCourse
part1.part2.part3 -> px.part999.parForTheCourse
part1.part2.part3.part4 (Not renamed because doesn't match sourceMask)
a.b.c -> ax.b999.crForTheCourse
a.b.CarPart3BEER -> ax.b999.CarParForTheCourse
短い名前が有効になっている場合、少なくとも8つ?
の名前と3つ?
の拡張子を持つsourceMaskは、常に短い8.3名に一致するため、すべてのファイルに一致します。
ren ????????.??? ?x.????999.*rForTheCourse
part1.part2.part3.part4 -> px.part999.part3.parForTheCourse
役に立つ癖/バグ?名前のプレフィックスを削除する
このSuperUserの投稿では、スラッシュ(/
)のセットを使用してファイル名から先頭の文字を削除する方法について説明しています。削除する文字ごとに1つのスラッシュが必要です。Windows 10マシンでの動作を確認しました。
ren "abc-*.txt" "////*.txt"
abc-123.txt --> 123.txt
abc-HelloWorld.txt --> HelloWorld.txt
この手法は、ソースマスクとターゲットマスクの両方が二重引用符で囲まれている場合にのみ機能します。必要な引用符がない次のすべてのフォームは、このエラーで失敗します。The syntax of the command is incorrect
REM - All of these forms fail with a syntax error.
ren abc-*.txt "////*.txt"
ren "abc-*.txt" ////*.txt
ren abc-*.txt ////*.txt
を/
使用して、ファイル名の中央または末尾の文字を削除することはできません。先行(プレフィックス)文字のみを削除できます。
技術的に/
は、ワイルドカードとして機能していません。むしろ、単純な文字置換を行っていますが、置換後、RENコマンド/
はファイル名で無効であることを認識し/
、名前から先頭のスラッシュを取り除きます。RENは、/
ターゲット名の途中で検出すると構文エラーを返します。
RENAMEの可能性のあるバグ-1つのコマンドで同じファイルの名前を2回変更することがあります!
空のテストフォルダーから開始:
C:\test>copy nul 123456789.123
1 file(s) copied.
C:\test>dir /x
Volume in drive C is OS
Volume Serial Number is EE2C-5A11
Directory of C:\test
09/15/2012 07:42 PM <DIR> .
09/15/2012 07:42 PM <DIR> ..
09/15/2012 07:42 PM 0 123456~1.123 123456789.123
1 File(s) 0 bytes
2 Dir(s) 327,237,562,368 bytes free
C:\test>ren *1* 2*3.?x
C:\test>dir /x
Volume in drive C is OS
Volume Serial Number is EE2C-5A11
Directory of C:\test
09/15/2012 07:42 PM <DIR> .
09/15/2012 07:42 PM <DIR> ..
09/15/2012 07:42 PM 0 223456~1.XX 223456789.123.xx
1 File(s) 0 bytes
2 Dir(s) 327,237,562,368 bytes free
REM Expected result = 223456789.123.x
sourceMaskは*1*
最初に長いファイル名と一致し、ファイルの名前はの期待される名前に変更されると思います223456789.123.x
。その後、RENAMEは処理するファイルを探し続け、新しい短い名前のを介して新しい名前のファイルを見つけます223456~1.X
。その後、ファイルの名前が再び変更され、最終的な結果が得られ223456789.123.xx
ます。
8.3形式の名前の生成を無効にすると、RENAMEで期待される結果が得られます。
この奇妙な振る舞いを誘発するために存在しなければならないトリガー条件のすべてを完全に解決したわけではありません。終わりのない再帰的なRENAMEを作成できるかもしれないと心配していましたが、それを誘導することはできませんでした。
バグを引き起こすには、以下のすべてが真実でなければならないと思います。私が見たバグのあるケースにはすべて以下の条件がありましたが、以下の条件を満たすすべてのケースがバグだったわけではありません。
- 短い8.3名を有効にする必要があります
- sourceMaskは元の長い名前と一致する必要があります。
- 最初の名前変更では、sourceMaskにも一致する短い名前を生成する必要があります
- 名前が変更された最初の短縮名は、元の短縮名よりも後でソートする必要があります(存在する場合)。