布団が俺を呼んでいる

丘山大一のぶろぐ

PowerShell ディスクサイズの使用状態をログで吐き出したい

自分メモ。
ディスクサイズの使用状態を日時のログで吐き出す。
実際使う時はタスクスケジューラあたりで呼び出す。

Get-PSDrive -Name C | Select-Object @{Name='datetime'; Expression={Get-Date -Format('yyyy/MM/dd')} } , Used, Free | ConvertTo-Csv -NoTypeInformation |Select-Object -Skip 1 |Out-File -FilePath 'Drive_C.txt' -Append

もっと簡単なやり方があったはずだが、「Windows Server 2008R2で動く」という本来あってはならない要件があり、試行錯誤してた結果こんなんを書いていた。


PowerShell 二行を一行にまとめる

自分メモ。
うまく言えないんですが、
aaa
bbb
ccc
ddd
というテキストを
aaa bbb
ccc ddd
に変換してファイル出力する感じ。


こんなん

$originalFilePath="hogehoge.txt"
$filePath = "fugafuga.txt"
[int]$count=0
Get-Content $originalFilePath | ForEach-Object {
  $count+=1
  If($count % 2 -eq 0){
    Write-Output($_) | Out-File -FilePath $filePath -Append -Encoding utf8
  }else{
    Write-Output($_ + "`t") | Out-File -FilePath $filePath -Append -NoNewline -Encoding utf8
  }
}

PackageManagement に挑戦その3

前回から大分間があいた。


更新について

apt update && apt upgrade 的な、プロバイダ経由で入れたパッケージの更新ってどうやるんでしょう?
Update-Package のようなコマンドがあるかと思いきや、見つからなかったのでゴリ押しました。


Get-Package -ProviderName ChocolateyGet
で取得した名前をもとにインストールかけてみました。うーん、これはやり方間違っている感。
あと、これだとインストールの度に「Y」を入力しなければならないです。
諸々、正しいやり方をだれか教えてください。探してもよく分からなかったんです……


それでな?

今更気が付いたんですが……


なぜKBがChoco経由でインストールされている……??

入れた覚えサパリないんですが。
https://chocolatey.org/packages/KB2919442
https://chocolatey.org/packages/KB2919355
たしかに公開されてはいるんですけど、なぜ入っている??


う~ん。分かりませぬ。
PackageManagement は導入部分の記事は多いんですけど、運用している人の記事をあまり見ないんですよね……
運用しなくなってしまったか、秘蔵のタレがあるのか、簡単すぎて記事にしないの3ケース。
……最後のケースのような気がするな……しくしく。

やっぱPowerShell も本を買って調べなおさないとダメですね……むむ。
↓の本はまだ買えていない((+_+))




PowerShell実践ガイドブック ~クロスプラットフォーム対応の次世代シェルを徹底解説~

新品価格
¥3,974から
(2019/3/14 11:30時点)

PowerShell Windows イベントログの最大値変更

電気屋でひっそりと展開されるWindows 10 Moibleコーナーで遊んでいたら、Windows 10 Moible を片手に遊び始める人がもう一人来て、驚きを隠せなかった丘山です。
町中でWindows 10 Moible持っている人、自分以外に初めて見た……
シェア0.5%未満だったと思いますが、つまりは数百人に一人くらいはいる計算なので、探せばそれなりに会えるのでしょうが。

と、それはともかく、久々のPowerShell ネタ。

Windowsログ(イベントビューアーで見れるヤツ)のログ最大値変更

例:イベントビューアー - セキュリティを右クリック - プロパティ - 最大ログサイズ の変更。

(※Powershell を管理者で実行して)
Limit-Eventlog -LogName Security -MaximumSize 20096KB

変更後の確認は、
Get-EventLog -List
から。

今回はこれだけ!


うごかして学ぶWindows PowerShell

PowerShell Zip 圧縮

自分メモ。最近更新していなかったからお茶を濁すための記事です。あと某国大統領選で胃が痛い。
PowerShell のバージョン5以降でzipが取り合え使えるようになっていたのかー、不勉強で知らなんだ。

というわけで試す。

①abcというzipファイルが作成され、
②元のファイルは削除される。
というスクリプト。

$FileName = "a.txt"
$ZipFileName = "abc.zip"
try
{
    Compress-Archive -Path $FileName -DestinationPath $ZipFileName -ErrorAction Stop
    Remove-Item $FileName -ErrorAction Stop
}
catch{
    Read-Host "例外!"
}

try、catch でくくって、かつそれぞれのコマンド後に「-ErrorAction Stop」を書いておかないと、Zipファイル作成に失敗した時でも元ファイルが削除されてしまうので注意。
ええ、もちろんやらかしましたとも。


Windows PowerShell超入門 [4.0対応]

新品価格
¥2,160から
(2015/10/5 23:59時点)


PowerShell 特定の画面を非表示にする(Win32API利用)

以前、C# のソースは書きましたが、
ちょっと違う画面を、という時に不便なのでPowerShellで書き直してみた。
サクッと画面名で絞り込んで使えるように、というわけで今回はプロセスからWindowTitleだけで絞っています。

$signature = @"
[DllImport("user32.dll")]
public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
"@
$SW_HIDE = 0
$func = Add-Type -MemberDefinition $signature -Namespace "Win32Functions" -name "ShowWindowFunction" -passThru

$Process = Get-Process | Where-Object {$_.MainWindowTitle -match "ほげほげ"}
foreach($p in $Process){
    $func::ShowWindow($p.MainWindowHandle, $SW_HIDE) 
}


【改訂新版】 Windows PowerShell ポケットリファレンス

新品価格
¥3,002から
(2015/12/3 23:18時点)

PowerShell 特定の処理を、実行者の任意のタイミングで繰り返す。(キー入力したら再度実行する)

アプリでDBを更新したら、その結果を確認、というのが面倒だったので簡易スクリプトを組む。
初めはSSMSで確認していたが、面倒になってきたので。

とりあえずやってみる。

リトライの「r」が入力されたら再実行。
do{
    $Sql =  ("select * from TABLE_A;
              select * from TABLE_B;")
    $DBLst = Invoke-Sqlcmd -Query $Sql -ServerInstance "localhost\名前付きインスタンス" –Username "sa" –Password "パスワード"
    $DBLst[0] | Format-Table 
    $DBLst[1] | Format-Table 
    $in = Read-Host "再度SQLを投げる場合はrを押下してください。"
} while ($in -eq "r")  

結論

本当は関数化するべきですね(ダメじゃん)。


【改訂新版】 Windows PowerShell ポケットリフ���レンス

新品価格
¥3,002から
(2015/12/3 23:18時点)

PowerShell 連番のフォルダを作成する

H××年 という形式のフォルダを作りたくなったので、やってみた。

Set-Locatiom ほげほげ
@(1..27) | ForEach-Object{New-Item - Type Directory ("H" +$_.ToString())}

上記でH1 ~ H27 というフォルダができます。


【改訂新版】 Windows PowerShell ポケットリファレンス

新品価格
¥3,002から
(2015/12/3 23:18時点)

PowerShell ユーザプロファイルの取得

すげー簡単でした。
Get-CimInstance -ClassName Win32_UserProfile

なんであんなに悩んでしまったんだろう……。

Windows PowerShell超入門 [4.0対応]

新品価格
¥2,160から
(2015/10/5 23:59時点)


PowerShell 配布したスクリプトを管理者権限で実行してもらう場合のパスの取り扱い

PowerShellスクリプト自体はbatファイル作って-ExecutionPolicyで実行させれば終わり。
ただ、batを管理者権限で実行させると、スクリプト自体がデスクトップに置かれた場合にパスを取得するのが微妙に面倒くさい。

まず起動用のbat自体について。同階層にあるスクリプトを起動する場合。
powershell -ExecutionPolicy RemoteSigned -File %~dp0%スクリプト名.ps1
%~dp0% をつけて、同階層にあるスクリプトのパスを明示して実行するようにする。

PowerShell 処理の中では、実行しているスクリプトの場所は下記でとれる。
$PSScriptRoot
ネットでは $MyInvocation.MyCommand.Path を使う方法をよく見たけど、私の環境では何故か動かなかった。
まあ原因はともかく$PSScriptRootでとる方が短く済んで簡単。



【改訂新版】 Windows PowerShell ポケットリファレンス

新品価格
¥3,002から
(2015/12/3 23:18時点)