catch-img

PowerShell 初心者でもできるスクリプトを使ったファイルコピー

本記事は、PowerShell初心者でスクリプトを作成する方に向けた記事です。

用語の意味等の解説は細かく行いませんので、他の言語に触れたことがあるということを前提としています。

ファイルのコピーをテーマにコンソールに入力された値を取得する方法や、カレントディレクトリの取得方法などを解説しています。

今回は簡単なファイルのコピーを行っていますが、関数の処理内容を変えることでほかのスクリプトに活用できるような内容となっています。

PowerShellを活用して反復作業を自動化し、業務の効率化を行いましょう。

目次[非表示]

  1. 1.はじめに
    1. 1.1.略歴
  2. 2.PowerShellについて
  3. 3.ファイルをコピーするスクリプト
    1. 3.1.スクリプト内容
    2. 3.2.スクリプト解説
      1. 3.2.1.変数宣言・ディレクトリ取得
      2. 3.2.2.関数(ファンクション)の定義
      3. 3.2.3.実行するかの確認
      4. 3.2.4.関数(ファンクション)の呼び出し
    3. 3.3.実行確認
  4. 4.まとめ

はじめに

略歴

私の略歴についてです。

2024年の新卒入社で、IT経験ほぼゼロでこの業界に飛び込みました。

入社後3ヶ月間の研修を経て、現在システム管理に関わる業務を行っています。

PowerShellは3ヶ月ほど業務で使用の経験があります。


PowerShellについて

PowerShellとは、一言でまとめますと「Microsoftが開発したスクリプト言語・CLIツール」です。

Microsoft公式では下記のように説明されています。

PowerShell は、コマンドライン シェル、スクリプト言語、および構成管理フレームワークで構成されるクロスプラットフォームのタスク自動化ソリューションです。 PowerShell は Windows、Linux、および macOS 上で実行されます。

  PowerShell とは - PowerShell この記事では、PowerShell のスクリプト環境とその機能の概要について説明します。 https://learn.microsoft.com/ja-jp/powershell/scripting/overview?view=powershell-7.4

PowerShellはWindowsに標準装備されているCLIツールとなっており、業務の自動化効率化に役立つツールの一つです。

また、対応したモジュールを使用することで、AzureAWSといったクラウドのリソースに対する操作も行うことができます。


そしてPowerShellの特徴の一つとして、コマンドレットが挙げられます。

コマンドレットはPowerShellで使用するコマンドの名称です。

[動詞]-[名詞]の命名規則によって構成されており、初心者でも感覚的に分かりやすいコマンドとなっております。


  • Get-Process 実行中のすべてのプロセスを取得する
  • Set-Location カレントディレクトリを指定した場所に変更する


また、後ろにパラメーターを書くことでパスの指定や、指定したものだけ出力することができます。


  • Set-Location –Path [パス] 指定したパスにディレクトリを変更する
  • Get-Process –Name [プロセス名] 実行中のプロセスのうち指定したプロセス名のものだけ取得する


ファイルをコピーするスクリプト

スクリプト内容

今回PowerShellを使用して作成するスクリプトはファイルをコピーするスクリプトです。

新規で用意したファイルを、既存のフォルダにコピーする内容となっています。

前提条件

  • コピー元のファイルはスクリプトファイルと同一のフォルダに存在する
  • コピー先のフォルダは固定(コマンド等で取得しない)
  • 既に存在する同名のファイルは上書き

処理内容

  • ファイルをフォルダにコピー
  • 開始時にメッセージを表示し、返答によって分岐


ファイルのコピーは手作業で簡単にできる内容ですが、システム管理として何台も行わなければならなかったり、他者に行ってもらわなければならない場合には、スクリプトを作成して自動化してしまうと作業の効率化につながります。



スクリプト
手作業
汎用性

◎ほかの作業でも使える

×都度対応しなければならない

効率

◎一度作成すれば何度もすぐに使える

×都度同じ内容で行わなければならない

確実性

◎手入力が少なく、ミスする可能性が小さい

△手入力により、ミスする可能性が大きい

手軽さ

△慣れるまで作成に時間がかかる

◎準備物の必要がない



スクリプト解説

前置きが長くなってしまいましたが、以下が実際に作成したスクリプトです。

#変数
$ErrorActionPreference = "Stop"
$ToolName = "ファイルコピーツール"
$Result = ""
$CopyResult = ""
$CurrentDir = $PSScriptRoot
$FilePath = Join-Path -Path $CurrentDir -ChildPath "コピーファイル.txt"
$FolderPath = "C:\ファイルコピー"

#########################

#実行ファンクション
function File-Copy{
	param(
		$SourcePath,
		$DestinationPath
	)
	try{
		Copy-Item -Path $SourcePath -Destination $DestinationPath
	}catch{
		Write-Host $error[0] -ForegroundColor Red
		return 1
	}
	return 0
}

#########################

#実行確認

$Result = Read-Host "実行しますか? [y]Yes [n]No"

if($Result -ne "y"){
	Write-Host "終了します。"
	Pause
	exit
}

#ファンクションの呼び出し
$CopyResult = File-Copy -SourcePath $FilePath -DestinationPath $FolderPath

if($CopyResult -eq 0){
	Write-Host "ファイルのコピーが完了しました。終了します。"
}elseif($CopyResult -eq 1){
	Write-Host "ファイルのコピーに失敗しました。終了します。"
}

Pause

exit

それでは、内容の解説に移ります。

※本解説では実際に使用したコマンドレット並びにパラメーターのみ解説いたしますので、各コマンドレットのパラメーターなどは使用する際にお調べください。

PowerShellのオンラインドキュメント

  PowerShell ドキュメントの使用方法 - PowerShell この記事では、検索のフィルター処理やバージョンの選択など、このサイトの機能を使用する方法について説明します。 https://learn.microsoft.com/ja-jp/powershell/scripting/how-to-use-docs?view=powershell-7.4

変数宣言・ディレクトリ取得

#変数
$ErrorActionPreference = "Stop"
$Result = ""
$CopyResult = ""
$CurrentDir = $PSScriptRoot
$FilePath = Join-Path -Path $CurrentDir -ChildPath "コピーファイル.txt"
$FolderPath = "C:\ファイルコピー"

使用している変数と、指定している内容は以下になります。

$ErrorActionPreference : エラー発生時の対応設定
$Result : 空(処理の中で選択結果を代入)
$CopyResult : 空(処理の中でファンクションの呼び出し結果を代入)
$CurrentDir : スクリプトファイルのカレントディレクトリ
$FilePath : コピーしたいファイルのパス
$FolderPath : コピー先のフォルダパス


簡単に、使用しているコマンドや自動変数について解説します。

PowerShellではエラーが発生した際の動作を$ErrorActionPreferenceという自動変数で設定することができます。デフォルトでは設定値がContinueとなっており、エラーメッセージを表示させた後に処理を継続する設定となっているため、処理を停止してエラーをスローすることができません。

本記事では後ほど解説しますが、Try-Catchを使う際にエラーをスローしたいため、こちらの自動変数の設定を変更しておくか、実行するコマンドに対してエラー時の動作を指定する-ErroraActionを使用する必要があります。

$PSScriptRootは実行中のスクリプトの親ディレクトリへのパスが取得できる自動変数です。カレントディレクトリの指定で使っています。

カレントディレクトリのパスを直接書かずに自動変数で取得することで、フォルダを移動した際にもコピー元のファイルのパスを書き換える必要が無くなります。

$FilePath = Join-Path -Path $CurrentDir -ChildPath "コピーファイル.txt"

先ほど取得したカレントディレクトリへのパスと、ファイル名を組み合わせてコピーしたいファイルへのフルパスを作っています。

Join-Path –Path [パス] –ChildPath [子パス]でパスと子パスを組み合わせることができます。


関数(ファンクション)の定義

#実行ファンクション
function File-Copy{
	param(
		$SourcePath,
		$DestinationPath
	)
	try{
		Copy-Item -Path $SourcePath -Destination $DestinationPath
	}catch{
		Write-host $error[0] -ForegroundColor Red
		return 1
	}
	return 0
}

PowerShellでは関数を使うことができます。

function 関数名{
    param(
        [引数名1],
        [引数名2]
    )
    [処理]
    return [戻り値]
}

もしくは

function 関数名 ([引数名1],[引数名2],...){
    [処理]
    return [戻り値]
}

で定義することができます。


呼び出す際には

関数名 -引数名1 引数1 -引数名2 引数2 ...

で呼び出すことができます。


このFile-Copyという関数ではファイルのコピーの処理を行っています。

実際にファイルのコピーを行う部分ですのでTry-Catchを使います。

コピーする際に使用しているコマンドレットは

Copy-Item -Path [コピー元のパス] -Destination [コピー先のパス] 

という構成です。

コピー元・コピー先のパスにはファイルやフォルダのパスを選択できます。

今回は引数の$SourcePathでコピー元のパスを受け取り、$DestinationPathでコピー先のパスを受け取り、コピーを実行しています。

戻り値として、正しく処理された場合には0を返し、異常が発生した場合には1を返す関数になっています。


エラーが発生しcatchへとスローした際Write-Host $error[0] -ForegroundColor Red
でエラー内容を表示させるようにしています。

Write-Hostはコンソールに文字を出力するコマンドレットです。

Write-Host "コンソールに出力したい文字"

とすることで、コンソールに文字を出力することができます。

$errorはPowershellの自動変数のひとつです。
発生したエラーが配列に格納され、最新のエラーは$error[0]に格納されます。
そのため、今回はtry内でエラーが発生しcatchに来た際に、エラーの情報を表示させます。

Write-Hostのオプションである-ForegroundColorを使うことで文字色をRedで指定し、エラーを目立たせています。

実行するかの確認

#実行確認
$Result = Read-Host "実行しますか? [y]Yes [n]No"

if($Result -ne "y"){
	Write-Host "終了します。"
	Pause
	exit
}

実行確認ではRead-Hostを使って実行するかどうかの確認をしています。

Read-Host "コンソールに出力したい文字"

とすることで、コンソールに文字を出力し、その後キーボードで入力された情報を受け取ります。

こちらが実際にRead-Hostを使って入力した際の表示です。

PS C:\> Read-Host "実行しますか? [y]Yes [n]No"

実行しますか? [y]Yes [n]No: 

今回の例では、入力された情報は$Resultという変数に直接格納され、その後の処理で使っています。

※コンソールに出力する文字は数字でも変数でも構いませんし、何もなくてもコマンドレットは使用できます。

そして、次のif文では変数に格納された値によって分岐され、今回はy以外が入力された場合に終了メッセージを表示させて、スクリプトが終了する処理になっています。

Write-Hostは出力するとすぐに処理が終わってしまうので、Pauseを使うことでユーザーの入力を待ちます。

Pauseを使うことで

続行するには、Enter キーを押してください...:

という文字が出力され、エンターキーを押すことで次の処理へと進みます。

exitで処理を終了させることができますので、処理を途中で終了させたい場合に記述します。


関数(ファンクション)の呼び出し

#ファンクションの呼び出し
$CopyResult = File-Copy -SourcePath $FilePath -DestinationPath $FolderPath

if($CopyResult -eq 0){
	Write-Host "ファイルのコピーが完了しました。終了します。"
}elseif($CopyResult -eq 1){
	Write-Host "ファイルのコピーに失敗しました。終了します。"
}

Pause

exit

関数を呼び出し、実際にファイルのコピーの処理を行っています。

File-Copy -SourcePath $FilePath -DestinationPath $FolderPath

で呼び出しを行っており、関数内で定義した引数のSoucePath$FilePathを渡し、DestinationPath$FolderPathを渡しています。

返ってきた戻り値をそのまま$CopyResultという変数に格納し、次のif文で戻り値の結果によって表示させるメッセージを分岐させています。


実行確認

それでは、実際にスクリプトを実行してみます。

ここで注意が必要なのですが、PowerShellには実行ポリシーというものがあります。

実行ポリシーを設定していない場合、.ps1のスクリプトファイルが実行できませんので、以下を参考に設定してください。

※セキュリティに関する部分ですので、慎重に設定してください。

  about_Execution_Policies - PowerShell PowerShell の実行ポリシーについて説明し、その管理方法について説明します。 https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_execution_policies?view=powershell-5.1


それでは実行しましょう。

今回作成したスクリプトファイルはFile_Copy.ps1というファイル名にし、Cドライブ直下に作成したコピーフォルダというフォルダに配置しました。

このスクリプトファイルを実行して、コピーファイル.txtというファイルをコピーします。



スクリプトファイルを実行したい場合にはファイルのフルパスをPowershellのコンソールで入力すると実行できますので、

C:\コピーフォルダ\File_Copy.ps1

と入力し、エンターキーを押します。

すると、実行確認が出ますので、「y」と入力してエンターキーを押します。

PS C:\> C:\コピーフォルダ\File_Copy.ps1
実行しますか? [y]Yes [n]No: 

問題無くコピーが完了すると以下のようなメッセージが表示されますので、エンターキーを押して終了となります。

PS C:\> C:\コピーフォルダ\File_Copy.ps1
実行しますか? [y]Yes [n]No: y
ファイルのコピーが完了しました。終了します。
続行するには、Enter キーを押してください...:

もしもコピー先のフォルダが無いといったエラーが発生した場合には、コンソールにエラーが発生した旨が表示されます。

その際はエラーの表示を見て対応しましょう。


では、実際にコピー先のフォルダを確認してみます。

無事にコピーが完了していますね。

これでコピー完了となります。


まとめ

今回はファイルをコピーするスクリプトの作成を行いました。

ファイルのコピーのみで処理としては簡単なものでしたが、関数の処理内容を変更することで、簡単に応用させることができるスクリプトファイルになっていると思います。

実際に業務内で同様の処理を行うスクリプトを使用した場面としては、アプリの再起動の処理などを加えた、既存の設定ファイルの差し替え等がありました。

また、最後になりますが今回作成したスクリプトはあくまでも1例です。使用するコマンドや変数などは、それぞれ使いやすいものを使っていただけたらと思います。

PowerShellはシステム管理の際に非常に役立ちますので、ぜひお試しください。

ページトップへ戻る