次のような名前のディレクトリがペアで50個あります。
ABC123-aaa-X0001
ABC123-bbb-X0001
XYZ456-aaa-X0001
XYZ456-bbb-X0001
SDF543-aaa-X0001
SDF543-bbb-X0001
名前の「-aaa-X0001」の部分をすべて削除して、次のようにします。
ABC123
ABC123-bbb-X0001
XYZ456
XYZ456-bbb-X0001
SDF543
SDF543-bbb-X0001
次に、"-bbb-X0001"ディレクトリを対応する名前が変更されたディレクトリに移動して、次のようにします。
ABC123
XYZ456
SDF543
したがって、これらにはそれぞれ、対応する"-aaa-X0001"ディレクトリの元の内容と、対応する"-bbb-X0001"ディレクトリがサブディレクトリとして含まれます。
これはすべてバッチファイルを使用して実行したいと思います。
ディレクトリの名前を変更するには、最初にREN
コマンドを使用してみました。
REN *-aaa-X0001 *
ワイルドカードがディレクトリ名で機能しないことをすぐに発見しました。
次に、MOVE
コマンドを使用してみました。
MOVE *-aaa-X0001 *
これも機能しません。
また、以下に基づいてさまざまなアイデアを試しました。
for /d "tokens=1,2,3 delims=-"
私は何時間もどこにも行かなくなったので、誰かが助けてくれることを願っています!
ありがとう。
名前の「-aaa-X0001」の部分をすべて削除します
「-bbb-X0001」ディレクトリを対応する名前が変更されたディレクトリに移動します
次のバッチファイル(test.cmd)を使用します。
@echo off
for /f "tokens=1-3 delims=-" %%a in ('dir /b /a:d') do (
if [%%b]==[aaa] (
ren %%a-%%b-%%c %%a
)
if [%%b]==[bbb] (
move %%a-%%b-%%c %%a
)
)
使用例:
F:\test\test>dir /b/s
F:\test\test\ABC123-aaa-X0001
F:\test\test\ABC123-bbb-X0001
F:\test\test\XYZ456-aaa-X0001
F:\test\test\XYZ456-bbb-X0001
F:\test\test\SDF543-aaa-X0001
F:\test\test\SDF543-bbb-X0001
F:\test\test\test.cmd
F:\test\test>test
1 dir(s) moved.
1 dir(s) moved.
1 dir(s) moved.
F:\test\test>dir /b/s
F:\test\test\test.cmd
F:\test\test\ABC123
F:\test\test\XYZ456
F:\test\test\SDF543
F:\test\test\ABC123\ABC123-bbb-X0001
F:\test\test\XYZ456\XYZ456-bbb-X0001
F:\test\test\SDF543\SDF543-bbb-X0001
F:\test\test>
_@echo off && setlocal enabledelayedexpansion
for /f "tokens=1-3 delims=-" %%a in ('dir /b /a:d "*-*-*"')do >nul (
if not "!_dir!" == "" move /y "%%~fa-%%~b-%%~c" "!_dir!"
set "_dir=" <nul || set "_dir=%%~fa-%%~b-%%~c"
)
for /f tokens^=1-3^delims^=^- %%a in ('dir /b /a:d "*-*-*"')do >nul (
move /y "%%~fa-%%~b-%%~c" "%%~fa"
)
endlocal && goto :EOF
_
予測可能な名前レイアウトを持つ50以上のディレクトリの場合、このbat/cmdコードはタスクを自動化できるため、編集は必要ありません。
したがって、すべての既知のフォルダ名をif
条件に追加する必要はありませんbat / cmd =ファイル。
1)_for /f
_ループを使用して、レイアウトターゲットが_-
_で区切られ、-を使用してすべてのフォルダーを一覧表示します。 _1-2-3
_トークン、および_%%~a-%%~b-%%~c
_フォルダー名のレイアウトは同じになりました_SDF543-bbb-X0001
_
for /f tokens^=1-3delims^=^- %%a in ('dir /on/b/a:d *-*-*')do
/on
_で一覧表示します2)_if not
_を使用して、変数に値(前/最後にリストされたフォルダー)が定義されているかどうかを確認できます__dir
_、条件がtrueの場合、現在のフォルダーは、__dir
_変数で定義された前のフォルダー名への最後のパスに移動されます。これは、パスと名前の一部が現在の変数と一致します_%~fa
_
_if not "!_dir!" == "" move /y "%%~fa-%%~b-%%~c" "!_dir!"
_
)次のコマンドは私には意味がありません。つまり、理論的には機能しないはずなのに、実際には機能するのに、どのように機能するのかわかりません。
_set "_dir=" <nul || set "_dir=%%~fa-%%~b-%%~c"
_
4)必要に応じてフォルダの名前を変更するための2番目のforループを追加し、名前から_-%%~b-%%~c
_を削除します
_move /y "%%~fa-%%~b-%%~c" "%%~fa"
_
私はそれがどのように機能するかを理解していないことを認めます、そして私はここで何が行われるかを説明する知識が不足しています、これを申し訳ありません、そして理論は次のようなものです:
_rem :: Command :: Explanation
set "_dir=" <nul :: remove _dir variable/value
set "_dir=" <nul || :: if _dir variable was not removed by set "_dir=" <nul
:: the next command will by executed
:: this "||" is called "operator"
set "_dir=%%~fa-%%~b-%%~c" :: if _dir variable was not removed, set the string
:: below to the value for the _dir variable:
:: %%~fa-%%~b-%%~c is the same to drive:\path\name_folder
_
コマンド_set "_dir =" <null
_は常に実行されているようですが、演算子_||
_はコマンドを実行しないでください_set "_dir = %%~fa-%%~b-%%~c"
_ =ですが、遅延拡張が有効になっている変数を使用すると、これが機能する理由になる可能性があります。
コマンドラインヘルプについては、_/?
_:を使用できます
_set /?, Ren /?, For /?, Dir /?, Setlocal /?, Endlocal /?, Goto /?, if /?, RMDir /?, RD /?
_
インターネットでは、次の点についてさらにヘルプを得ることができます:
コマンドラインからのファイルの名前変更では、Renameコマンドを使用してファイルの名前を変更する方法を説明しました。 Renameコマンドを使用してディレクトリの名前を変更することもできます。以下の構文を参照してください。
Dir_oldname dir_newnameの名前を変更します。例:
G:\ data> mkdir dir1 G:\ data> dir/b dir1 G:\ data> rename dir1 dir2 G:\ data> dir/b dir2 G:\ data>名前変更コマンドでは、移動できないことに注意してくださいファイルを別のドライブまたはディレクトリに移動します。このコマンドは、既存のファイル/フォルダーの名前を変更するだけで、新しいファイルは作成しません。そのため、ターゲットファイル名のフルパスは受け入れられません。これを実行しようとすると、「コマンドの構文が正しくありません」というエラーが表示されます。
例:
C:\ docs> ren 1.txt c:\ docs\2.txtコマンドの構文が正しくありません。以下のrenameコマンドは正常に機能します。
C:\ docs> ren c:\ docs\1.txt 2.txt C:\ docs> dir/b 2.txt名前変更操作にren(名前変更の短縮形)を使用することもできます。 RenとRenameの両方が同じコマンドを参照しています。
このコマンドを使用して、すべてのWindows OSエディション(Windows 2000、XP、Vista、およびWindows 7)のファイルまたはディレクトリの名前を変更できます。