はじめに
こんにちは!
BFT名古屋支店・インフラ女子(?)のやまぐちです。
プロジェクトでとても時間がかかるのが仕様書作成やエビデンス取得などでのExcel操作。
エンジニアなはずなのに実際の職業は『Microsoft使い』となっていることも多々あります。
今回は試験項目ごとにエビデンスのファイルをひな形からコピーするためのPowerShellを作ってみました。画面試験のエビデンスを指定されたひな形に貼っていく作業の前準備です。ちなみにPowerShellはいつも先人のみなさまのお知恵を拝借して自分なりの汎化を加えてます。
もし「こういう風にした方が早いよ!」とか「この方がもっといいよ!」というご意見がありましたらぜひコメントいただければと思います。
スクリプト内容
処理概要
この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)は単に一行ごとにコピー先ファイル名を記載するだけです。
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を調べたり書いたりできるのでありがたい限りです。便利ツールを使いこなして、少しでも業務を効率に進めていきましょう。
以上、ここまで読んでいただきありがとうございました~^ ^