2018年3月11日日曜日

【PowerShell】batから管理者権限で実行ポリシー(ExecutionPolicy)変更

Install.bat等から管理者権限でPowerShellを起動し、実行ポリシーを変更する。-waitを指定すると初回実行時(Execution Policyが変更されていない場合)にエラーが表示されるため、> nullでエラーを捨てている。
powershell "start-process powershell '-Command Set-ExecutionPolicy RemoteSigned -Confirm' -wait" -verb runas > nul 
ただし、ユーザアカウント制御のダイアログと以下のウインドウが表示される。

【PowerShell】PC起動時にメール送信

と言っても、タスクスケジューラーを使う。zip内のinstall.batを実行して メールやタスクスケジューラー登録を行う。使用しているのは、bat、PowerShell、タスクスケジューラーなので、動かない場合は適切に書き換える。
BootMail_v0.1.zip

■ソース(Bootメール送信.ps1)
# 設定ファイルのパス
$MyInvocation.MyCommand.Path | Split-Path -Parent | sv path
Join-Path $path setting.json | sv setting_path

# 設定ファイル読み込み
cat $setting_path | ConvertFrom-Json | sv conf

# 認証情報生成
ConvertTo-SecureString $conf.pass | sv pass
New-Object System.Management.Automation.PSCredential $conf.user, $pass | sv cred

# ホスト名取得
hostname | sv hst

# メール送信
Send-MailMessage `
    -To         $conf.to     `
    -From       $conf.from   `
    -SmtpServer $conf.server `
    -Port       $conf.port   `
    -Subject    "PC Boot"  `
    -Credential $cred        `
    -UseSsl                  `
    -Body       $hst
■ソース(設定ファイル作成.ps1)
# スクリプトのパスと設定ファイルのパス
$MyInvocation.MyCommand.Path | Split-Path -Parent | sv current_path
Join-Path $current_path setting.json | sv setting_path

Read-Host "送信先(to)メールアドレスを入力してください。"   | sv to
Read-Host "送信元(from)メールアドレスを入力してください。" | sv from
Read-Host "SMTPサーバアドレスを入力してください。"         | sv server
Read-Host "SMTPサーバポート番号を入力してください。"       | sv port

Get-Credential -m "【メールアカウント】と【パスワード】を入力して下さい。" | sv cred

# ユーザ入力情報から設定ファイルを作成。
@{
    to     = $to
    from   = $from
    server = $server
    port   = $port
    user   = $cred.UserName
    pass   = ConvertFrom-SecureString $cred.Password
} | sv setting
    
ConvertTo-Json $setting | Set-Content $setting_path

【PowerShell】タスクスケジューラー登録はWin7とWin8以降で別

  • Windows7
    • schtasks
  • Window8やWindow10は、以下が使用可能
    • New-ScheduledTaskPrincipal
    • New-JobTrigger
    • New-ScheduledTaskAction
    • Register-ScheduledTask

    schtasksよりRegister-ScheduledTaskの方が色々できそうだが、残念ながらWin7では使えない。

    2018年3月8日木曜日

    【Linux】コマンドのプログレス表示(リアルタイム表示)を加工する

    ■CentOSの場合
    ./progress.sh | xargs -n 1 -d '¥x0D' | sed -u "s/copied/【copy progress report】/g" | awk -v ORS="¥r" '{print;}'

    ■Ubuntuの場合(CentOSでもできるかも)
    ./progress.sh | xargs -n 1 -d '\x0D' | sed -u "s/copied/【copy progress report】/g" | ruby -pe 'sub("\n", "\r")'

    ■加工内容の変更
    sedの引数を変更すると加工内容を変更できる。 -eで正規表現使用可能。
    上記では、copiedを【copy progress report】に変換している。

    ■補足
    ・sedだけいけると思いきや、プログレス表示は、CRしか来ないのでsedが実行されない。sedはLFを待ってから実行されるみたい。そのため、xargsでCRが来る度にパイプ先に渡すようにする。次にsedで加工。xargsでLN改行したので、最後にawkやrubyでCRに戻す。
    ・awkやrubyのバージョン、Linuxの種類によって、できたりできなかったりする。

    ◆例) 以下のようなprogress.sh(中身はかなりテキトー)があったとする。
    #!/bin/bash
    
    for i in `seq 1 100`; do
      complete=`expr ${i} \* 10`
      echo -en "copied $complete/1000KB (${i})%\r"
      sleepenh 0.1 > /dev/null
    done
    echo
    
    ※Ubuntuでしかもsudo apt install sleepenhが必要。CentOSの場合はusleepに読み替えること。

    このprogress.shを実行すると、以下のように表示される。

    加工コマンドをかますと、以下となる。