ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

QNo.3709318 Windowsで指定「以外」のファイルを移動したい
質問者:KiKuNaGa3 Dドライブ
├MyDocuments
├Userdata
├ファイルA
├ファイルB
└ファイルC

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

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

コマンドプロンプト以外をよく知らないのですが、他の方法でも構いません。
よろしくお願いいたします。
困り度:
  • すぐに回答を!
質問投稿日時:
08/01/24 14:40
最新から表示回答順に表示

回答

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
回答者:iriyak
種類:回答
どんな人:経験者
自信:自信あり
回答日時:
08/05/10 18:56
この回答への補足この回答に補足をつける(質問者のみ)
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

ANo.4 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
回答者:Bonjin
種類:回答
どんな人:一般人
自信:参考意見
回答日時:
08/01/27 13:27
この回答への補足この回答に補足をつける(質問者のみ)
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

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

http://www.vector.co.jp/magazine/softnews/060627/n0606273.html
回答者:celtis
種類:アドバイス
どんな人:経験者
自信:参考意見
回答日時:
08/01/25 10:18
この回答への補足この回答に補足をつける(質問者のみ)
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

ANo.2 もう1つ方法が。

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

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

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

なお「それ以外のフォルダ」も無視されるので、D:\は「フォルダだけ存在する状態」になります。
回答者:chie65536
種類:回答
どんな人:一般人
自信:参考意見
回答日時:
08/01/24 15:15
この回答への補足すみません、書き間違えていました。
「Dドライブのデータ」に移動させたいのは
MyDocumentsとUserdataを除いた全てのファイル「とフォルダ」でした…
でもこの方法は良さげですね。
これに加えてフォルダも移動できればいいのですが…
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

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

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

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

あとはドラッグして移動するだけ。
回答者:chie65536
種類:回答
どんな人:一般人
自信:参考意見
回答日時:
08/01/24 15:02
この回答への補足この回答に補足をつける(質問者のみ)
この回答へのお礼手動でやるのは最終手段のつもりだったのですが「選択の切り替え」は盲点でした!
少し賢くなりました。ありがとうございます。
最新から表示回答順に表示