web-dev-qa-db-ja.com

ディレクトリ名を変更し、ディレクトリを移動するためのWindows10バッチファイル

次のような名前のディレクトリがペアで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=-"

私は何時間もどこにも行かなくなったので、誰かが助けてくれることを願っています!

ありがとう。

2
JDR

どうすればいいですか

  1. 名前の「-aaa-X0001」の部分をすべて削除します

  2. 「-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>

参考文献

1
DavidPostill
_@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
_

enter image description here

予測可能な名前レイアウトを持つ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
  • Obs.:フォルダを名前の順序_/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 /?_

インターネットでは、次の点についてさらにヘルプを得ることができます:

0
It Wasn't Me

コマンドラインからのファイルの名前変更では、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)のファイルまたはディレクトリの名前を変更できます。

0
lewis hamilton