こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Windowsで指定「以外」のファイルを移動したい

Dドライブ
├MyDocuments
├Userdata
├ファイルA
├ファイルB
└ファイルC

このようなフォルダ構成のドライブがあります。
このドライブ直下に「Dドライブのデータ」というフォルダを作成し
その中にMyDocumentsとUserdataを除いた全てのファイルを「移動」したいと考えています。
対象の端末数が多いので、バッチか何かで自動化したいと考えているのですが
何か良い方法はありませんでしょうか?

・MOVEコマンドは除外の指定が出来ないので使えません。
・XCOPY+DELは、ドライブの空き容量(D以外も含む)の関係で出来ません。
・ユーザーによってファイルAがファイル1だったり、ファイルFまであったりするので
一つずつMOVEを書いたバッチを作るというのも難しいです。

コマンドプロンプト以外をよく知らないのですが、他の方法でも構いません。
よろしくお願いいたします。

投稿日時 - 2008-01-24 14:40:42

QNo.3709318

すぐに回答ほしいです

質問者が選んだベストアンサー

WSHを使った方が楽ですがバッチで作るとこんな感じですかね…

@ECHO OFF

' 移動元ディレクトリ
SET SRC_DIR=D:

' 移動先ディレクトリの名前
SET DEST_DIR_NAME=Dドライブのデータ

' 移動先のディレクトリのフルパス
SET DEST_DIR=D:\%DEST_DIR_NAME%

REM ファイルを移動する
FOR %%f IN ("%SRC_DIR%\*") DO MOVE "%%f" "%DEST_DIR%"

REM ディレクトリを移動する
FOR /D %%d IN ("%SRC_DIR%\*") DO (
REM 除外するディレクトリか調べるサブルーチンを調べる
REM %%~ndは%%dのファイル名(ディレクトリ名)
CALL :IS_EXCLUDE_DIR "%%~nd"

REM 終了コードが1以上の場合はディレクトリを移動する
IF NOT ERRORLEVEL 1 MOVE "%%d" "%DEST_DIR%"
)

EXIT /B


REM 除外するディレクトリか調べるサブルーチン
:IS_EXCLUDE_DIR
SETLOCAL
FOR %%e IN ("My Documents" "Userdata" "%DEST_DIR_NAME%") DO (
REM 除外するディレクトリの場合、終了コードに1を返す
IF /I %%e EQU %1 EXIT /B 1
)
)
ENDLOCAL
EXIT /B 0

投稿日時 - 2008-01-27 13:27:26

ANo.4

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

こんにちは。

ANo.3 で紹介された UWSC でのプログラム例です。

(使用法)

・スクリプトを保存しておきます
・エクスプローラウインドウを開いて D:\ を開いておきます
・スクリプトを起動します

(コメント)

★1 途中経過を都度表示しながらする場合 true を設定します
★2 エクスプローラウインドウのタイトルの一部もしくは全部を設定します (D:\ 直下ならこのままでOK)
★3 サンプルはコピー&ペーストですが、カット&ペーストする場合は VK_C → VK_X に変更します

(スクリプト)

const _debug = false // ★1 false → true (ダイアログ表示)
public wid

confirm("開始します...")
wid = GETID("ボリューム (D:)", "CabinetWClass") // ★2 "ウインドウのタイトル"

confirm("フォルダを作成します...")
SCKEY(wid, VK_ALT, VK_F, VK_W, VK_F)
SLEEP(0.1)
SCKEY(wid, VK_ENTER)
SLEEP(0.1)
SCKEY(wid, VK_APPS, VK_M)
SLEEP(0.1)
SENDSTR(wid, "Dドライブのデータ")
SLEEP(0.1)
SCKEY(wid, VK_ENTER)
SLEEP(0.1)

confirm("未選択の状態にします...")
SCKEY(wid, VK_CTRL, VK_A)
SLEEP(0.1)
SCKEY(wid, VK_ALT, VK_E, VK_I)
SLEEP(0.1)

confirm("コピー対象を選択します...")
KBD(VK_CTRL, DOWN)
SLEEP(0.1)
CLKITEM(wid, "MyDocuments", CLK_MUSMOVE, false)
SLEEP(0.1)
KBD(VK_CTRL, UP)
SLEEP(0.1)

KBD(VK_CTRL, DOWN)
SLEEP(0.1)
CLKITEM(wid, "Userdata", CLK_MUSMOVE, false)
SLEEP(0.1)
KBD(VK_CTRL, UP)
SLEEP(0.1)

KBD(VK_CTRL, DOWN)
SLEEP(0.1)
CLKITEM(wid, "Dドライブのデータ", CLK_MUSMOVE, false)
SLEEP(0.1)
KBD(VK_CTRL, UP)
SLEEP(0.1)

SCKEY(wid, VK_ALT, VK_E, VK_I)
SLEEP(0.1)
SCKEY(wid, VK_CTRL, VK_C) // ★3 VK_C → VK_X (移動の場合)
SLEEP(0.1)

confirm("コピーします...")
CLKITEM(wid, "Dドライブのデータ", CLK_LEFTCLK)
SLEEP(0.1)

SCKEY(wid, VK_APPS, VK_P)
SLEEP(0.1)

confirm("終了しました (Exiting...)")

procedure debugOut(s, indent = 0)
  if _debug then print FORMAT(" ", indent * 4) + s
fend

procedure confirm(s)
  if _debug then MSGBOX(s)
fend

投稿日時 - 2008-05-10 18:56:03

ANo.3

UWSCなどのマクロソフトで操作を記録し、それを各端末で実行させてみてはどうでしょうか? chie65536さんがおっしゃっている「選択の切り換え」を記録させれば、ファイル名が異なるような環境でも動作すると思います。

http://www.vector.co.jp/magazine/softnews/060627/n0606273.html

投稿日時 - 2008-01-25 10:18:30

ANo.2

もう1つ方法が。

d:
cd \
md Dドライブのデータ
for %f in (*.*) do move d:\%f d:\Dドライブのデータ

と書いたバッチファイルを動かせば「D:\にあるファイルが全部」移動されます。

for コマンドは「フォルダは無視する」ので、MyDocumentsとUserdataは移動されません。つまり「MyDocumentsとUserdataを除いた全てのファイル」が移動されます。

なお「それ以外のフォルダ」も無視されるので、D:\は「フォルダだけ存在する状態」になります。

投稿日時 - 2008-01-24 15:15:35

補足

すみません、書き間違えていました。
「Dドライブのデータ」に移動させたいのは
MyDocumentsとUserdataを除いた全てのファイル「とフォルダ」でした…
でもこの方法は良さげですね。
これに加えてフォルダも移動できればいいのですが…

投稿日時 - 2008-01-24 15:28:41

ANo.1

エクスプローラーで手動で移動するのが一番早いと思います。

MyDocumentsをクリックし、Ctrlキーを押しながらUserdataもクリック。

MyDocumentsとUserdataの両方が選択状態になったら、「編集」「選択の切り換え」で、MyDocumentsとUserdataの「2つ以外」を選択状態にする。

あとはドラッグして移動するだけ。

投稿日時 - 2008-01-24 15:02:53

お礼

手動でやるのは最終手段のつもりだったのですが「選択の切り替え」は盲点でした!
少し賢くなりました。ありがとうございます。

投稿日時 - 2008-01-24 15:31:57

あなたにオススメの質問