or1ko's diary

日々を書きます

3秒間ごとにコピーするスクリプト

指定したフォルダ($src)から指定したフォルダ($dest)にコピーするスクリプト
ただし、ファイルやフォルダを一つコピーするたびに3秒待つ。
また、フォルダの更新日付はコピーした日付となる。

$src = "<コピー元のフォルダパス>"
$dest = "<コピー先のフォルダパス>"
$waitSeconds = 3 # 待ち時間(秒)

Get-ChildItem $src -Recurse |
ForEach-Object {
    $isDir = $_.GetType().ToString().Contains("DirectoryInfo")
    $file = $dest + $_.FullName.Substring($src.Length)
    Write-Host "check $file"
    $exists = Test-Path -LiteralPath $file
    if (-not $exists) {
        if ($isDir) {
            Write-Host "make directory -> $file"
            New-Item -Path $file -ItemType Directory
        } else {
            Write-Host "copy file -> $file"
            Copy-Item -Path $_.FullName -Destination $file
        }
        Write-Host "wait $waitSeconds seconds"
        Start-Sleep -Seconds $waitSeconds
    }
}

月ごとのデータをよこ軸に集計する方法

たまに下記のような、月ごとのデータを

name mouth count
Tom 5 2
Jhon 6 3
Tom 6 3

下記のように変換して、
月の遷移を確認したくなることがある。

name 5 6
Tom 2 3
Jhon 0 6

そういう場合は、Group-Objectを使うと便利

PS > $table = [PSCustomObject]@{name="Jhon";mouth=5;count=2},
[PSCustomObject]@{name="Tom" ;mouth=6;count=3},
[PSCustomObject]@{name="Jhon";mouth=6;count=3}

PS > $table

name mouth count
---- ----- -----
Jhon     5     2
Tom      6     3
Jhon     6     3

PS > $table | Group-Object -Property name |
% {
    $a = [PSCustomObject]@{name=$_.name}
    $_.Group | % {
        $a | Add-Member -NotePropertyMembers @{$_.mouth=$_.count}
    }
    $a
}

name 5 6
---- - -
Jhon 2 3
Tom    3

WebページからBodyのテキストを取得する方法

PowerShellでスクレイピング 後編 HTMLをパースする - PowerShell Scripting Weblog

下記の記事で見つけた。
Invoke-WebRequestの結果は、
IEで解析されBody要素のDOMを扱えるとのことなので、
下記の通りすると、できる

$contents = Invoke-WebRequest $url
$contents.ParseHtml.body.innerText

PowerShellすごいなー。

Invoke-RestMethodの文字化け対策

gooラボ 形態素解析APIを試してみる - pierre3のブログ

上のブログに記載されてました。
Invoke-RestMethodは諦めて、下記のようにInvoke-WebRequestを使うようです。

$res = Invoke-WebRequest -Method Post $url -Body $body
$con = [System.Text.Encoding]::Utf8.GetString([System.Text.Encoding]::GetEncoding("ISO-8859-1").GetBytes($res.Content))
#JSONの場合は下記のように変換する
ConvertFrom-Json $con 

transparentネットワークを使う方法

デフォルトで存在するnatネットワークを使って、-pオプションでポートを指定して、
EXPOSEも設定したのだが、うまくつながらなかった。
色々調べたけれど、さっぱりわからなかった。
natにこだわりがあるわけでないので、
natでなくて、物理ネットワークをそのままつなげる方法を
試したところ、うまくいったので、その方法をメモする。

・まずは、transparentのネットワークを作成

docker network create -d transparent transparent

・そのネットワークを指定して起動する

docker run --net=transparenet ... <省略>

この方法に切り替えて、すぐにできたので、はよ切り替えればよかった。

下記を参考にした。
Windows コンテナーのネットワーク | Microsoft Docs

Excelファイルの操作(ImportExcel)

以前よりCOMを使ったexcelの操作方法は知っていたのだが、
覚えられるほど簡単ではなかったのであまり使かうことはなず、
csvファイルで出力し、手作業でxlsやxlsxファイルに変換することが多かった。

先日、PowerShellGetの存在をしり、ImportExcelという
モジュールが提供されていることを知って、結構気になっていて、
調べてみることにした。

PowerShell Gallery | ImportExcel 3.0.1

  • gciの結果をexcelファイルへエクスポート
gci | excel-export test.xlsx

期待通りに出力される。

以上

csvの2つ以上の列が同じ行を除去する方法

get-uniqueでプロパティを指定できたら良かったのですが、
できないので、一度、重複判定するための列を追加して、
sort-objectを-uniqueを呼び出して、除去する。