88980


PowerShell初心者です。

早速ですが、私の外付けHDD（Sドライブ）には色々なデータがあります。  
これを別の外付けHDD（Tドライブ）にコピーしてバックアップをとりたいです。  
そこで作成したコードは以下です。

[code]

    try{
        cp S:\XXX T:\ -Recurse
    }catch{
        $error[0] | Format-List -force | Out-File "error.log"
    }finally{
        Write-Output "HDDのバックアップが完了しました"
    }
    
[/code]

※try-catch文のことは正直理解できていないのですが、エラーが起きた時にどこで起きたのかログに残したいと思ったのでこのように書きました。

これでバックアップはできました。  
ここからが本題なのですが、今後オリジナル（Sドライブ）にデータが追加されたり変更されたときに、それをバックアップデータ（Tドライブ）にも反映させたいです。

私が考えているイメージは以下です。

  1. オリジナルのデータがTドライブに存在しているか確認
  2. 存在していなければコピーをとる（if文？）
  3. オリジナルの全データに対して同様の確認を行う（for文？）

このようなコードはどのように作ればいいでしょうか。  
また、他に良い方法があれば教えていただきたいです。


CC BY-SA 4.0
2022-05-22T07:15:49.857
88978
2022-05-22T21:13:34.670
48769
question
powershell
更新されたデータのみHDDにバックアップするコードを作りたい


単純な `copy` コマンドを使うより、`robocopy` コマンドを使った方が簡単に実現できそうです。  
ただしバックアップ目的であれば最低でも `/xo` オプションは付与した方が良さそうです。

[Windowsのrobocopyコマンドでコピーするファイルの種類を選択／変更する](https://atmarkit.itmedia.co.jp/ait/articles/1309/27/news116.html)

>
> デフォルトでは、robocopyは「Changed」「Newer」「Older」となっているファイルだけをコピーするようになっている。つまり、内容が変更されているか、コピー元の方が新しいか、逆にコピー元の方が古い（コピー先の方が新しい）ファイルだけをコピーする。
>
> #### 古いファイルをコピーさせない
>
> xcopyの `/d` オプションでは、コピー元の方が古いファイルはコピーしないが、robocopy
> はデフォルトではこのようなファイルでもコピーする。これを変更して xcopy のようにするには `/xo` オプションを付ける。


CC BY-SA 4.0
2022-05-22T07:29:24.213
88980
2022-05-22T07:29:24.213
3060
88978
answer


バックアップは手段であって目的ではありません。障害時のリストアが本来の目的なはずです。そしてこの質問にはリストア計画がなく、どのようにバックアップすれば目的が達せられるかが示されていません。

> 今後オリジナル（Sドライブ）にデータが追加されたり変更されたときに、それをバックアップデータ（Tドライブ）にも反映させたい

この説明を読む限り、バックアップしなくてもディスクのミラーリングで済むのではと思いました。  
外付けドライブとのことで、外した際に同期がとれず意味がなくなるかもしれませんが。その場合は、Windows標準機能の[バックアップと復元](https://support.microsoft.com/ja-
jp/windows/%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97%E3%81%A8%E5%BE%A9%E5%85%83-windows-352091d2-bb9d-3ea3-ed18-52ef2b88cbef)でもいいかもしれません。

いずれにしても、どのファイルがどのように変更されたかはOSが一番よく把握しています。またバックアップモードでの読み取りといった機能もあります（[`robocopy`であれば`/b`オプション](https://docs.microsoft.com/en-
us/windows-server/administration/windows-commands/robocopy#copy-
options)）。専用ツールに任せることをお勧めします。

あまり知られていませんが、Windowsのファイルシステムの場合、`A`（アーカイブ）属性が存在します。ファイルの作成や変更を行うと自動的に`A`が付与されます。バックアップソフトは`A`が付与されているファイルをバックアップを行うと共に`A`をクリアします（[`robocopy`であれば`/m`オプション](https://docs.microsoft.com/en-
us/windows-server/administration/windows-commands/robocopy#file-selection-
options)）。`A`属性を信用できる場合は、これにより更新されたファイルを効率よく見つけることができます。ただし、属性付きでファイルコピーを行うなど、属性を明示的に操作した場合、`A`属性が期待と異なる状態になる可能性があるため、判断が必要です。

[`Copy-Item`](https://docs.microsoft.com/en-
us/powershell/module/microsoft.powershell.management/copy-
item?view=powershell-7.2)にはそこまでの機能がありませんので、お勧めできません。


CC BY-SA 4.0
2022-05-22T21:13:34.670
88986
2022-05-22T21:13:34.670
4236
88978
answer