BFT名古屋 TECH BLOG

日々の業務で得た知識を所属するエンジニアたちがアウトプットしていきます。

【Powershell】テキストファイルからファイル名を取得して一括コピーする

はじめに

こんにちは!
BFT名古屋支店・インフラ女子(?)のやまぐちです。

プロジェクトでとても時間がかかるのが仕様書作成やエビデンス取得などでのExcel操作。
エンジニアなはずなのに実際の職業は『Microsoft使い』となっていることも多々あります。

今回は試験項目ごとにエビデンスのファイルをひな形からコピーするためのPowerShellを作ってみました。画面試験のエビデンスを指定されたひな形に貼っていく作業の前準備です。ちなみにPowerShellはいつも先人のみなさまのお知恵を拝借して自分なりの汎化を加えてます。

もし「こういう風にした方が早いよ!」とか「この方がもっといいよ!」というご意見がありましたらぜひコメントいただければと思います。

スクリプト内容

f:id:bftnagoya:20211112151406p:plain:w550

処理概要

このPowerShellスクリプトは、スクリプト中の変数でコピー元ファイル名を指定し、ファイル名指定ファイル(CopyFiles.txt)にコピー先のファイル名を記載すれば、同ディレクトリに配置したコピー元ファイルから一括でファイルコピーをします。

せっかくなので、ファイル名指定ファイルがない場合やファイル名指定ファイルにコピー先ファイル名の記載がない場合は、PowerShellプロンプトにエラーを出力する作りにしました。

実行してみると

コピー元ファイルを「root.xlsx」、コピー先ファイル名を「a.xlsx」とした実行結果です。ディレクトリを作成後、コピーをしていることがわかります。

PS C:\Users\18-107\Desktop\PowerShellTest> dir


    ディレクトリ: C:\Users\18-107\Desktop\PowerShellTest


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        2021/11/12     12:25           1252 CopyFiles.ps1
-a----        2021/11/12     12:44             14 CopyFiles.txt
-a----        2021/11/12     11:11        1172628 root.xlsx


PS C:\Users\18-107\Desktop\PowerShellTest>
PS C:\Users\18-107\Desktop\PowerShellTest> .\CopyFiles.ps1
[INFO] コピー先ディレクトリ Copied を作成しました。
[INFO] root.xlsx から C:\Users\18-107\Desktop\PowerShellTest\Copied\a.xlsx をコピーしました。
[INFO] ファイルコピーが完了しました。
PS C:\Users\18-107\Desktop\PowerShellTest>


コピー先フォルダ(.\Copied)以下に「a.xlsx」ができています。

PS C:\Users\18-107\Desktop\PowerShellTest> Get-ChildItem -Recurse


    ディレクトリ: C:\Users\18-107\Desktop\PowerShellTest


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        2021/11/12     15:22                Copied
-a----        2021/11/12     12:25           1252 CopyFiles.ps1
-a----        2021/11/12     12:44             14 CopyFiles.txt
-a----        2021/11/12     11:11        1172628 root.xlsx


    ディレクトリ: C:\Users\18-107\Desktop\PowerShellTest\Copied


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        2021/11/12     11:11        1172628 a.xlsx

ファイル名指定ファイル(CopyFiles.txt)は単に一行ごとにコピー先ファイル名を記載するだけです。
f:id:bftnagoya:20211112153305p:plain:w400

PowerShell全体

作成したPowerShellスクリプトです。

### 変数(必要に応じて変更)
# コピー元情報
$FromCopyFileName = "root.xlsx"

# コピー先情報
$ToCopyDirName = "Copied"
$CurDirPath = Convert-Path .
$ToCopyFilesName = "CopyFiles.txt"

### 処理
# コピー先ファイル名を記載したファイルの存在確認
if (-not (Test-Path .\$ToCopyFilesName ))
{
  Write-Host "[ERROR] $ToCopyFilesName を作成してください。"
  break
}elseif ((Get-Content -Path $CurDirPath\$ToCopyFilesName).Length -lt 1)
{
  Write-Host "[ERROR] コピー先のファイル名を $ToCopyFilesName に記載してください。"
  break
}

# コピー先ディレクトリの作成
if (-not (Test-Path .\$ToCopyDirName))
{
  New-Item .\$ToCopyDirName -ItemType Directory > $null
  Write-Host "[INFO] コピー先ディレクトリ $ToCopyDirName を作成しました。"
 }

# ファイルコピー
$FileNameArray = Get-Content .\$ToCopyFilesName

foreach($a in $FileNameArray)
{
  Copy-Item .\$FromCopyFileName $CurDirPath\$ToCopyDirName\$a
  Write-Host "[INFO] $FromCopyFileName から $CurDirPath\$ToCopyDirName\$a をコピーしました。"
}

Write-Host "[INFO] ファイルコピーが完了しました。"

終わりに

こういう機会があると普段触らないPowerShellを調べたり書いたりできるのでありがたい限りです。便利ツールを使いこなして、少しでも業務を効率に進めていきましょう。

以上、ここまで読んでいただきありがとうございました~^ ^