すべてのファイルがコピーされるのをそばで見守るほどばからしいことはありません。「スケジュールされたタスク」を利用して自動化することを考えましょう。
ファイルをある場所から別の場所にコピーすることは、どんな方法をとっても簡単な作業です。Windows エクスプローラでファイルをドラッグ・アンド・ドロップする方法、PowerShell で Copy-Item を行う方法、DOSで単純なコピーコマンドを使用する方法など、さまざまな方法があります。ソースとデスティネーションのパスを指定し、その他のオプションのパラメータをいくつか設定するだけです。問題に遭遇するのは、多数のファイルを頻繁にコピーする必要が生じたときです。
ファイル・コピーを自動化する場合、特に Windows 環境では、よく使われるスクリプト言語は、Windows の PowerShell です。1つ以上のファイルをある所から別のデスティネーションに手早くコピーする必要がある場合は、PowerShell が大変便利です。PowerShell スクリプトは簡単に手動で開始できますが、Windows のスケジュールされたタスクを使用して PowerShell スクリプト経由で転送を開始することもできます。
このブログでは、スクリプトを書いてそのスクリプトを定期的に実行する「スケジュールされたタスク」を作成するという形をとって、PowerShell を使用してファイルを転送する方法について説明します。始める前に、PowerShell v4 以降のバージョンががコンピュータにインストールされていることを前提としていることをお断りしておきます。古いバージョンの場合は、ここで説明する通りには動作しないかもしれません。
スクリプトを作成
最初に、ファイル転送を実行するスクリプトを作成する必要があります。CopyFiles.ps1 と呼ぶことにしましょう。このスクリプトには次のコードが含まれます:
param(
[string]$SourcePath,
[string]$DestinationPath
)
Copy-Item –Path $SourcePath –Destination $DestinationPath -Recurse
ご覧のように、スクリプトはシンプルですが、環境に応じて多くのカスタマイズが可能です。
このスクリプトの最も複雑な部分は param() セクションです。これは、SourcePath と DestinationPath の2つのパラメータを含むパラメータブロックです。パラメータを使うことでスクリプトに異なる値を渡すことができ、再利用できるようになります。SourcePath と DestinationPath が実際のパスであれば、異なるファイル・コピーごとに別々のスクリプトを作成する必要があります。
このスクリプトを手動で実行するとしたら、次のようにします。
& .\CopyFiles.ps1 –SourcePath C:\Source –DestinationPath \\SERVER\Destination
この例では、C:\Source フォルダ内のすべてのファイルとサブフォルダを \\SERVER\Destination 共有フォルダにコピーします。
スケジュールされたタスクの作成
CopyFiles.ps1 という PowerShell スクリプトができたので、このスクリプトを起動させたいコンピュータに向かってください。このスクリプトを1日に1回、午前3時に実行する「スケジュールされたタスク」を作成することにしましょう。
タスクスケジューラのGUIを実行してスケジュールされたタスクを作成することもできますが、ここでは自動化がテーマなので、PowerShell でスケジュールされたタスクを作成する方法を示します。そのためには、次の4つのステップが必要です。
- スケジュールされたタスクのアクションを作成
- トリガーを作成
- スケジュールされたタスクをメモリに作成
- スケジュールされたタスクをコンピュータ上に作成
具体的には、次のようになります。まず、スケジュールされたタスクのアクションを作成します。これは、任意の引数とともに実行するEXEを定義します。スクリプトが C:\CopyFiles.ps1 にあると仮定しています。
$Action = New-ScheduledTaskAction -Execute
'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe' -Argument "-NonInteractive -NoLogo
-NoProfile -File 'C:\CopyFiles.ps1' –SourcePath 'C:\Source –DestinationPath '\\SERVER\Destination'"
次に、毎日午前3時に開始するトリガーを作成します。
$Trigger = New-ScheduledTaskTrigger -Daily -At '3AM'
その次は、作成したアクションとトリガーを使用して、スケジュールされたタスクをメモリに作成します。
$Task = New-ScheduledTask -Action $Action -Trigger $Trigger -Settings (New-ScheduledTaskSettingsSet)
最後に、スケジュールされたタスクをシステム上に作成します。File Transfer Automation と名付け、提供されたパスワードを使用してローカル管理者のアカウントで実行します。
$Task | Register-ScheduledTask -TaskName 'File Transfer Automation' -User 'administrator' -Password 'supersecret'
これでスクリプトが登録され、毎日午前3時に、すべてのファイルがソースからデスティネーションにコピーされます。
Adam Bertram
Adam Bertram is a 20-year veteran of IT. He’s currently an automation engineer, blogger, independent consultant, freelance writer, author, and trainer. Adam focuses on DevOps, system management, and automation technologies as well as various cloud platforms. He is a Microsoft Cloud and Datacenter Management MVP and efficiency nerd that enjoys teaching others a better way to leverage automation.