Powershell: テキストファイルを一行ずつクリップボードにコピー

仕事で作業をしていると、Excelのセルデータを一個ずつWebページの入力フィールドにコピーするような作業が発生することがあります。とっても馬鹿馬鹿しい単純作業ですが、誰かが作業しなければ次に進まない!ルーターの初期設定画面にあらかじめ指定されているファイヤーウォールルールのパラメータをExcelシートの行からコピーして設定するようなケースですね。(ルーターなら普通はコンフィグファイルを読み込むでしょうけど、これは一例なので深く考えない。)
パラメータの数が少なければ、Excelファイルから直接コピー&ペーストを繰り返すのも良いかも知れませんが、コピーすべきパラメータ数が20とか50とかに増えてくると、コピー作業しているセルを見失って間違えそうです。または初期設定しなくてはならない機器台数が数10台に及ぶようなケースもあります。

Excel ファイルではなく、一行に位置パラメータが記述されている次のようなファイルのパラメータを上から順番に、コピー&ペーストするようなケースも同様に、作業しているセルを見失いがちです。

適当なパラメータシートがなかったので、サンプルは郵便番号-住所 データで代用。

<サンプルテキストファイル addr.txt>

〒 734-0053
広島県
広島市南区
青崎
アオサキ
・・・・・
・・・・・

そこで、指定したテキストファイルを上から順番に一行ずつコピーバッファに取り込み、Enter を押す毎に次の行をコピーバッファに取り込む PowerShell スクリプトを書きました。

これを使うと何がいいかというと、マウスで行う作業がペースト(貼り付け)だけになるということ。コピーするセルを間違えることはないし、コピー範囲を間違えることもありません。

あらかじめ、設定する相手に合わせてテキストデータを作っておく必要はありますが、PowerShell ウィンドウと設定ウィンドウを左右に並べておいて、PowerShell 画面で Enter をタイプして一行データをクリップボードに取り込み、ウィンドウを切り替えて貼り付け。また Powershell に戻って Enter。
途中に空白行がある場合は、無視されて次のパラメータにスキップしてしまいます。(if文のところ。)

テキストファイルを正しく作成しておけば、コピー操作が不要になるためデータを間違えて書き込んでしまう可能性が大幅に低下し、ヒューマンエラーが減ります。

# <line_copy_to_clipboard.ps1>
# この関数は、以下のURLからコピーしたものです。
# https://gallery.technet.microsoft.com/scriptcenter/5481e36a-8073-40ae-92cd-fbef1e6df99a
#
 
Function Get-FileName($initialDirectory) 
{   
  [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") |  Out-Null
 
    $OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog 
    $OpenFileDialog.initialDirectory = $initialDirectory 
    $OpenFileDialog.filter = "All files (*.*)| *.*" 
    $OpenFileDialog.ShowDialog() | Out-Null 
    $OpenFileDialog.filename
 
} # Get-FileName 関数の終わり
 
# *** スクリプトのエントリ ポイント ***
 
$working_dir="C:\Users\usagi\OneDrive\ドキュメント"
$done_dir="C:\Users\usagi\OneDrive\ドキュメント\done"
 
$textfile_path=Get-FileName -initialDirectory "C:\Users\usagi\OneDrive\ドキュメント"
$parameters=(get-content $textfile_path)
 
$i=0
foreach ($para in $parameters){
    $i++
    if ($para -ne ""){
        $para|clip
        "$i : $para"
    }
    $in = Read-Host "Press ENTER KEY, then next"
}
 
echo ""
echo ""
echo "$textfile_path was finished."

# 作業済みファイルは別のフォルダーに移動して、重複作業しないようにする。 
Move-Item $textfile_path $done_dir

PowerShell 実行結果はこんな感じ。表示だけ行番号を入れています。クリップボードに行番号はコピーしません。終了がわかるように、行末までゆくとメッセージを表示します。この時クリップボードには前のデータを保持しています。

<PowerShell ISE 実行結果>

1 : 〒 734-0053
Press ENTER KEY, then next: 
2 : 広島県
Press ENTER KEY, then next: 
3 : 広島市南区
Press ENTER KEY, then next: 
4 : 青崎
Press ENTER KEY, then next: 
5 : アオサキ
Press ENTER KEY, then next: 


C:\Users\usagi\OneDrive\ドキュメント\addr.txt was finished.

ここには、紹介していませんが、Excel に複数のパラメータを記述する場合は、行方向に延ばして行く傾向にあるので、事前にExcel の1行が1ファイルになるように変換を行っておく必要があります。

Excel ファイルを直接 PowerShell から操作するのは面倒なので、一度 CSVテキストファイルに、自分の都合の良い並びに変換して保存しておいたものを、一行が1テキストファイルになるように変換するスクリプトを書きました。

先頭セルがファイル名になります。(セル内のA列に拡張子は不要)

$working_dir = "C:\temp\work"
$master_csv = "C:\temp\work\input_data.txt"
 
cd $working_dir
 
$master_data = (Get-Content $master_csv)
 
$i = 0
 
foreach ($l in $master_data){
    $j=0
    $file=$l.Split(",")[0]+".txt"
    foreach($m in $l.Split(",")){
        if ($m -ne ""){
            $m >> $file
        }
    }
    echo ""
    $i++
}

C:\Temp\work\input_data.txt として保存した CSVファイルが、一行ごとにテキストファイルになり、C:\Temp\work に保存されます。

コメントを残す