指定したデータストアがローカルディスクなのかを判定するPowerCLI


PowerShell/PowerCLIを使ってデータストアの空き容量チェックを行う過程で、ローカルディスクのVMFSは無視したい、というものがある。
ESXiホスト台数が増加することを考えると名前による除外などはやりたくない。
何らかの手法でローカルディスクかどうかを判定できないかを探した。

・Get-Datastoreで取得できる情報の範囲で確定できるものが無い
  vSphere6であれば「ExtensionData.Summary.MultipleHostAccess」というデータストアが
  複数のホストからアクセス可能か?というフラグ(true or false)があるが、
  1台のホストだけ接続しているiSCSi,FCデータストアも対象になるのでは?(未確認)
・Get-ScsiLunには「IsLocal」というローカルディスク判定フラグがある
・Get-ScsiLunはデータストアを指定して実行することができる
・ESXiホストが停止しているデータストアに対するGet-ScsiLunはエラーとなる
・アクセス出来ないデータストアは「Accessible」フラグがfalseとなる

これらを元に作成した判定

$localdatastore=$false # フラグ
$datastore = Get-Datastore "データストア名" 
if($datastore.Type -eq "VMFS"){
  # VMFSだとローカルディスクの可能性があり
  # それ以外の、NFS,vsanは対象外
  if($datastore.ExtensionData.Summary.MultipleHostAccess -eq $true){
    # MultipleHostAccessがTrueなら、ローカルディスクではないことが確定
    $localdatastore=$false
  }elseif($datastore.Accessible -eq $true){
    # アクセスできるならGet-ScsiLunがエラーにならない
    $diskinquire = Get-ScsiLun -Datastore $datastore
    if($diskinquire.IsLocal -eq $true){
      # IsLocalによるローカルディスク確定
      $localdatastore=$true
    }
  }else{
    # アクセスできないデータストア
  }
}

PowerShellのファイル出力先を実行ユーザのデスクトップにする


PowerShellのファイル出力先を、実行したユーザのデスクトップにする場合に、「$env:USERPROFILE + “\Desktop\filename.txt”」と指定するのは間違い。

これだと、ローカルディスクでは無く、ファイルサーバ上にDesktopが置かれるような環境に対応できない。

「[Environment]::GetFolderPath(“Desktop”)」で取得するのが正しい。

実際に、どういう風になるのか見てみる・・・

PS C:\Users\osakanataro> $env:USERPROFILE + "\Desktop"
C:\Users\osakanataro\Desktop

PS C:\Users\osakanataro> [Environment]::GetFolderPath("Desktop")
\\fileserver1\Redirects$\osakanataro\Desktop

Desktop以外に指定できる内容については「Environment.SpecialFolder Enum」(以前のURL Environment.SpecialFolder Enumeration)参照のこと。

「Added in the .NET Framework 4.」なっているものは、Windows7/WindowsServer2008などの古めのWindowsでは動かないので注意。

PowerShellを使って日本語メールを送信する方法(v2.0も対応する版)


PowerShellを使ってメールを送信する方法を探すと2種類でてくる

・PowerShell cmdletの「Send-MailMessage」を使う
・Net.Mail.SmtpClient と Net.Mail.MailMessage を使う

UTF8で日本語メールを送る場合を考えると、Send-MailMessageを使用することで用が足りるようである。

ただ、Windows7で標準インストールとなるPowerShell v2.0だと、「Send-MailMessage -Encoding UTF8 ~」と指定すると、下記のエラーとなり、エンコーディングの指定がうまく行かない。そして、エンコーディングを指定せずに送ると日本語は文字化ける。

Send-MailMessage : パラメーター 'Encoding' をバインドできません。"eutf8" の値を "System.String" 型から "System.Text.Encoding" 型に変換できません。
発生場所 行:1 文字:28
+ Send-MailMessage -Encoding eutf8
+                            ~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Send-MailMessage]、ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.SendMailMessage

これは、「UTF8」の代わりに、System.Text.Encodingに変換したUTF8を指定「([System.Text.Encoding]::UTF8)」することで解決できる。

また、PowerShell v2.0のSend-MailMessageには、SMTPポートの番号指定が無い。
25番以外の場合は、「Net.Mail.SmtpClient と Net.Mail.MailMessage」の方を行う必要があるようだ。

そんなわけで、スクリプト例は下記の様になる。
なお、PowerShell Core 6.0でも利用できた。

$smtpserver= "サーバ名"
$port= 25
$mailfrom="ユーザ名@ドメイン名"
$mailtoArray=@(
   "ユーザ1@ドメイン名",
   "ユーザ2@ドメイン名",
   "ユーザ3@ドメイン名"
   )
$mailsubject="メール送信テスト"
$mailbody="これはメールの送信テストです。`n"+"正常に送信出来ていますか?"

if($PSVersionTable.PSVersion.Major -gt 2){
   Send-MailMessage -From $mailfrom -To $mailtoArray -SmtpServer $smtpserver -Port $port -Encoding utf8 -Subject $mailsubject -Body $mailbody
}else{
   # PowerShell v2.0用処理。ポート番号指定除去と、Encoding指定方法変更
   Send-MailMessage -From $mailfrom -To $mailtoArray -SmtpServer $smtpserver -Encoding ([System.Text.Encoding]::UTF8) -Subject $mailsubject -Body $mailbody
}

え?

ISO-2022-JPでメール送らなくていいのかって?

いまどきUTF-8を受け取れない環境は論外なので気にしなくていいです。(iPhone/Androidの絵文字は基本Unicodeベースなので、送信されるメールはISO-2022-JPではありません)

AndroidのバックアップソフトHeliumでデスクトップアプリを使わずadbコマンドだけで行う方法



Androidのバックアップソフト「Helium」はAndroid標準のバックアップ/リストア機能を流用する形で実現している。

ただ、Heliumの機能を使うためにはパソコンにHelium Desktopアプリをインストールし、そこから何かを行わせる必要がある。
Helium Desktop Installer and Android App」を見ると、いまは、Chromeアプリ、Windowsアプリ、MacOSXアプリ、Linuxアプリ、がある模様。

で、Linuxの配布内容を見てみると、中身は、adbコマンドとシェルスクリプトのみ。
これなら、アプリを入れず、adbコマンドだけで実現できるのでは?と実験してみる

BASE=$(dirname $0)
pkg=$($BASE/adb shell pm path com.koushikdutta.backup)
# apparently pm path appends a carriage return which screws
# up the class name in dalvikvm invocation
pkg=$(echo $pkg | cut -d : -f 2 | sed s/\\r//g)
echo $pkg
$BASE/adb shell << EOF CLASSPATH=$pkg app_process /system/bin com.koushikdutta.shellproxy.ShellRunner2 $@ & exit EOF

(1)adbコマンドで、Heliumアプリ(com.koushikdutta.backup)がインストールされているパス名調査
(2)そのパス名をCLASSPATH環境変数に指定して、コマンド実行

という感じ。
私の環境では
(1) /data/app/com.koushikdutta.backup-1/base.apk
(2)「CLASSPATH=/data/app/com.koushikdutta.backup-1/base.apk app_process /system/bin com.koushikdutta.shellproxy.ShellRunner2」
ということなので、

「adb shell」でAndroid端末にshellで入り、「CLASSPATH=/data/app/com.koushikdutta.backup-1/base.apk app_process /system/bin com.koushikdutta.shellproxy.ShellRunner2」を実行することで、アプリインストールの代替とすることができた。

GOLE2のクラウドファウンディングが開始されるも変態度が激下がり



5月に「中華ベンダGOLE社のGOLE1というタッチパネル付きミニPC」という記事でGOLE1のクラウドファウンディングを紹介しました。
これは無事出荷されました。

で・・・6月にはGOLE2を企画してるよ、との発言があり、どうなるかな?と思っていたところ
ついに、クラウドファウンディングが開始されました。

GOLE2, The real Mini PC with FHD wide-angle camera
gole2-1

・タッチパネルを廃止
・TVの横に置いて使うことを想定
・カメラを装備
・Intel Z8350搭載のWindows10モデルと、Allwinner A64搭載のAndroidモデルの2つを用意
・2.5インチHDD/SSD内蔵可能
・日本語マニュアル付き

Androidモデル・・・とはいっても、正確にはAOSPベースの「Phonenix OS」を採用(JideのRemixOSと似たようなもんです)

価格は
・Phoenix OSモデル(Orange): $69(100個限定),$79(200個限定),$89(300個限定),$99
・Windows10モデル(White or Black): $114(50個限定), $124(100個限定),$134(200個限定)

うーーーーん・・・・
それほど・・・コレといって・・・