背景
会社でのディレクトリ管理に困ってた時のTips
いろんなお客さんとのやり取りを、
- みんなで1つのディレクトリ配下に格納しよう!
- 命名規則もこうしてね!
みたいなお作法があった。これが不便。
例:
0001_A12345_<和名>
0002_B32899_<和名>
0003_Q77791_<和名>
※これが200個以上ある...
<ナンバー>_<顧客コード>_<顧客コードに対する和名>みたいな感じ。
これだと、目的の顧客コードがどの辺にあるのかスクロールして探していくのが、毎回億劫で...
要するに、
「顧客コードが先行して分かっているが、フォルダのナンバーは分からん」
なシチュエーションで困ってた。
なお現状、この顧客コードとナンバーの対応表が存在するのだが、それをわざわざ開いて検索して~の流れも手間なので、何か楽ちんなやり方無いかな~のTips
DNSチックにコマンドぽちーでレコード出せないかな?
という事で考えてみた。
顧客コードをPowershellに入力したら、ナンバー返してくれる結果を目指す!
といっても、会社PCにリゾルバをインストールして...てやるとセキュリティの管理も大変なので、標準機能だけで代替できる事考えてみた
結果
できました。全レコードのリストと、個別のリストを出すパターンですね。
PS C:\Users\USER> $source | format-table
num name flag text
--- ---- ---- ----
0001 A12345 TRUE Last Update by Tanaka
0002 B32899 FALSE Deleted
0003 Q77791 TRUE Don't Edit
PS C:\Users\USER> $source | Where-Object {$_.name -match "A12345"}
num name flag text
--- ---- ---- ----
0001 A12345 TRUE Last Update by Tanaka
PS C:\Users\USER>
じつは事前に以下で変数を宣言しておく必要があります。
PS C:\Users\USER> $path = "$env:USERPROFILE\Documents\list.csv"
PS C:\Users\USER> $source = Import-Csv $path -Encoding UTF8
※今回のサンプルでは、documents配下にリストを配置しており、これを参照しております。リストのヘッダーとして後述の4要素を追加しております。
今後の話
実は、以下もPowershellからぽちっとcsv操作できるが、一旦次回にまわす。
・レコードを新しく追加する。
・レコードを編集する。
(CSV開いて追記すればいいじゃん は、一旦なしで)
後は備忘録です。
$path = "$env:USERPROFILE\Documents\list.csv"
これ、ダブルクォーテーションでくくらないとエラーが出ます。
後に打つコマンドによっては問題なく動作しますが
ヘッダーについて
$source = Import-Csv $path -Encoding UTF8
$headers = @("num","name","flag","text")
$record = New-Object psobject | Select-Object $headers
$var = @()
レコードを追加するときに、こんな感じで入れてます。
$source
でリストをインポートして、$headers = @()
でヘッダーを追加し、$record
にこの後値を登録していきます。
既存のファイルを操作するときは必要ないです。
また、$record
の中身は$var
に入れてから最終的にエクスポート。
PS C:\Users\USER> $record."num" = "0001"
PS C:\Users\USER> $record."name" = "A12345"
PS C:\Users\USER> $record."flag" = "TRUE"
PS C:\Users\USER> $record."text" = "Last Update by Tanaka"
PS C:\Users\USER> $record
num name flag text
--- ---- ---- ----
0001 A12345 TRUE Last Update by Tanaka
こんな感じで登録されます。
次に$var
の使い道ですが、
PS C:\Users\USER> $var += $record
PS C:\Users\USER> $var
num name flag text
--- ---- ---- ----
0001 A12345 TRUE Last Update by Tanaka
PS C:\Users\USER> $record = New-Object psobject | Select-Object $headers
*ここからはまた$recordに次の値を入れていく*
こうすれば、$record
にはまた次の値が上書きされますが、$var
にデータは逃げているので問題ないです。
PS C:\Users\USER> $var
num name flag text
--- ---- ---- ----
0001 A12345 TRUE Last Update by Tanaka
0002 B32899 FALSE Deleted
0003 Q77791 TRUE Don't Edit
PS C:\Users\USER> $var | export-csv -path $path -NoTypeInformation -Encoding UTF8 -append
最後に$var
をもとのリストに追記すれば完了!
最後のオプション -append を付けないと、$var
の値が上書きされ、いままでのデータが消えます。
-notypeinformation
ですが、これ無いと勝手にヘッダーが作成され、作ったヘッダーはレコードの1つのように扱われます。
最終的には.ps1のファイルにまとめたいですね。