XCOPYについて教えて下さい。

Aサーバーの共有フォルダ内のデータを
Bサーバーの共有フォルダに毎日自動でバックアップを取ります。

Bサーバーの共有フォルダには毎日自動で「20110124」「20110125」のようにフォルダが作成され
Aサーバーの更新されたファイルのみをバックアップして行きます。

%DATE% 関数で実現可能なようですが私には扱いきれません><

どなたかそのまま貼り付ければOK!!のうな回答をお願いします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2011/01/31 13:40:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答6件)

id:deflation No.1

回答回数1036ベストアンサー獲得回数126

ポイント19pt
xcopy [Aサーバの共有フォルダ名] [Bサーバの共有フォルダ名]\%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%\ /e /f /h

参考「xcopyコマンド」

id:hogehoho

xcopy D:\B D:\A \%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%\ /e /f /h

上記の様に動かしてみましたがうまくいきませんでした><

2011/01/25 08:43:21
id:online_p No.2

回答回数1153ベストアンサー獲得回数59

id:hogehoho

ありがとうございます。一通り目を通してみます。

2011/01/25 08:48:03
id:Mook No.3

回答回数1314ベストアンサー獲得回数393

ポイント18pt

>xcopy D:\B D:\A \%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%\ /e /f /h

>上記の様に動かしてみましたがうまくいきませんでした><


はオプションの引数が正しくないからだと思いますが。

日付として指定するのであれば、/D オプションですし、

フォルダ名として指定するのであれば、パスの間にスペースがあってはいけません。

"" でパスを囲むと、このような問題を回避できます。


下記のようにしてどうでしょうか。

@Echo Off
Set StrDate=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%
Echo XCopy "D:\B" "D:\A\%StrDate%\" /E /F /S /C /H

ただ、実際にコピーしたいのは前日からの変更分ではないですか?

この仕様だとバックアップを実行した後で、その日に変更した分がコピーされないと思いますが、

日付が変わった直後に前日分をとるというのが、漏れがないかと思います。


できなくはないと思いますがバッチは日付計算が苦手なので、上記の対応をするのであれば、

VBS 等にした方が簡単かもしれません。


一応下記は前日のバックアップを取る VBS のサンプルです。

拡張子を .vbs にして実行してみてください。

Option Explicit 
 
Const SrcPath = "D:\A"   ' コピー元 
Const DstPath = "D:\B"   ' コピー先 
 
Dim yesterDate 
yesterDate = DateAdd("d",Date(),-1) 
 
Dim optDate 
optDate    = Month(yesterDate) & "-" & Day(yesterDate) & "-" & Year(yesterDate) 
 
Dim folderDate 
folderDate = Replace(FormatDateTime(yesterDate ,vbShortDate),"/","") 

CreateObject("WScript.Shell").Run "XCopy """ & SrcPath & """ """ & DstPath & "\" & folderDate & "\"" /C /E /F /H /S /Y /D:" & optDate, , True  

タスクスケジューラで実行する場合、黒いコマンドウィンドウが出るのが気になるときには、

Run の第二引数で 0 を指定することでこれを回避できます。

詳細は下記を参照ください。

http://d.hatena.ne.jp/Mook/20090824/1251124084


不明な点はコメントにて対応しますので、有効にお願いします。

id:hogehoho

コメントありがとうございます。

しかも長々と感激です。

一応バッチでやってみました。

D:\A>xcopy D:\A D:\B\%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%\ /e /f /h /d:01-26-2011

フォルダAは必ず深夜更新されます。

実行するのはAM9:00と仮定しますと、上記の記述だと

2011/01/26以降更新されたファイルとなるかと思います。

パソコンの日付を25日にしてあげると25日以降・・・

余計な26日も混ざりますがよしとします。

しかし、今のやり方だと実行する都度日付を記入しなければいけません。

出来ればオートにしたいのですが。

どのように記述したら良いでしょうか?

2011/01/26 13:27:13
id:okamotoy No.4

回答回数131ベストアンサー獲得回数15

ポイント18pt

set today=%date:/=%

set fromdir=a

set todir=b\%today%

mkdir %todir%

xcopy %fromdir% %todir% /E /H /O


なカンジでどうでしょう.

http://www.atmarkit.co.jp/fwin2k/win2ktips/446xcopy/xcopy.html

id:Mook No.5

回答回数1314ベストアンサー獲得回数393

ポイント18pt

先の回答にも書きましたが、下のコメント機能を有効にしてください。

(回答にコメントいただいても返信できませんので。)


私の回答にコメントいただいたことは、先の回答ですべて記載したつもりです。

バッチでの日付計算(前日を求める)は、できなくはないですが大仰な処理になります。

VBScript であれば下の一行です。

DateAdd("d",Date(),-1) 

先の回答の後半のスクリプトは、前日からの変更分を XCopy で処理するというものですので、

まずは試してみてもらえますか?

notepad などにコードを張り付け、Backup.vbs などで保存してダブルクリックするだけです。

http://ja.wikipedia.org/wiki/VBScript


下記のコードは、XCopy を実行する代わりに、実行するコマンドの内容をメッセージで表示するものです。

下を実行してもらえば、先の回答が何をしているかもわかると思います。

Option Explicit 
 
Const SrcPath = "D:\A"   ' コピー元 
Const DstPath = "D:\B"   ' コピー先 
 
Dim yesterDate 
yesterDate = DateAdd("d",Date(),-1) 
 
Dim optDate 
optDate    = Month(yesterDate) & "-" & Day(yesterDate) & "-" & Year(yesterDate) 
 
Dim folderDate 
folderDate = Replace(FormatDateTime(yesterDate ,vbShortDate),"/","") 

WScript.Echo "XCopy """ & SrcPath & """ """ & DstPath & "\" & folderDate & "\"" /C /E /F /H /S /Y /D:" & optDate  
id:hogehoho

うまくいかないです><

このように出ています。

「XCopy "D\A" "D:\B\20110127\" /C /E /F /H /S /Y /D:1-27-2011」

ポップアップしてOKを返しましたが何も起こりません。

2011/01/28 11:43:09
id:nonnon5ojp No.6

回答回数1ベストアンサー獲得回数0

ポイント18pt

test

id:hogehoho

test2

2011/01/27 09:28:41
  • id:okamotoy
    set today=%date:/=%
    set fromdir=a
    set todir=b\%today%

    mkdir %todir%

    FOR /F %%a IN (date.txt) DO (
    xcopy %fromdir% %todir% /D:%%a /e /f /h
    )

    echo %DATE:~5,2%-%DATE:~8,2%-%DATE:~0,4% > date.txt


     少々改修.
     「毎日一回ずつ」実行すれば,「前日以降に修正したファイルをバックアップ」になります.
     このやり方のいいところは,たとえば「ある日バックアップを忘れた(失敗した)」としても,「次の日に2日分のバックアップをしてくれる」ところです.
     ダメなところは,一日2回バックアップしようとすると「date.txt」の内容が「今日」になってしまうことですね.
     
     
  • id:Mook
    いやだって、2回目の回答は何をするかを「表示するだけ」のスクリプトですからw。

    実際にコピーをするのは、最初の回答のを使用下さい。
    両方欲しければ、最後の行の

    WSCript.Echo ...
    CreateObject....

    部分を一緒に書いてください。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません