Category Archives: プログラム

PowerShellスクリプト(ps1)を実行しやすくする


PowerShellスクリプト(ps1)に対して、ファイルをドラッグ&ドロップしてもファイルを認識して実行してくれない。

また、そもそもPowerShellスクリプトを実行しようとしても、下記のエラーで実行ができない。

PS C:\Users\osakanataro\Documents\powershell> .\powershelltest.ps1
スクリプトの実行がシステムで無効になっているため、ファイル C:\Users\osakanataro\Documents\powershell\powershelltest.ps1 を読み込めません。詳細については、「get-help about_signing」と入力してヘルプを参照してください。
発生場所 行:1 文字:25
+ .\powershelltest.ps1 <<<<
    + CategoryInfo          : NotSpecified: (:) &#91;&#93;、PSSecurityException
    + FullyQualifiedErrorId : RuntimeException
PS C:\Users\osakanataro\Documents\powershell> 

回避方法は下記の2つを行う、ということ
・バッチファイル経由でPowerShellを起動する
・うまく行かない場合は、管理者権限でバッチファイルを起動する

今回使用したバッチファイルは下記の内容とした

@echo off
rem PowerShellスクリプトの実行が禁止されている場合に
rem このバッチファイルを管理者権限で動作させると
rem PowerShellスクリプトが実行できます。
powershell -sta -ExecutionPolicy Unrestricted -File %0\..\powershelltest.ps1 %*

powershell起動時に「-sta」オプションをつけているのは、powershellからフォームダイアログを開こうとすると、下記のエラーがでてしまうことを回避するため。
powershell-sta

なお、詳細を開くと下記の情報が出力されている

Just-In-Time (JIT) デバッグを呼び出すための詳細については、
ダイアログ ボックスではなく、このメッセージの最後を参照してください。
************** 例外テキスト **************
System.InvalidOperationException: DragDrop 登録は成功しませんでした。 ---> System.Threading.ThreadStateException: OLE が呼び出される前に、現在のスレッドが Single Thread Apartment (STA) モードに設定されていなければなりません。Main 関数に STAThreadAttribute が設定されていることを確認してください。
   場所 System.Windows.Forms.Control.SetAcceptDrops(Boolean accept)
   --- 内部例外スタック トレースの終わり ---
   場所 System.Windows.Forms.Control.SetAcceptDrops(Boolean accept)
   場所 System.Windows.Forms.Control.OnHandleCreated(EventArgs e)
   場所 System.Windows.Forms.ListBox.OnHandleCreated(EventArgs e)
   場所 System.Windows.Forms.Control.WmCreate(Message& m)
   場所 System.Windows.Forms.Control.WndProc(Message& m)
   場所 System.Windows.Forms.ListBox.WndProc(Message& m)
   場所 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   場所 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
************** 読み込まれたアセンブリ **************
mscorlib
    アセンブリ バージョン: 2.0.0.0
    Win32 バージョン: 2.0.50727.5485 (Win7SP1GDR.050727-5400)
    コードベース: file:///C:/Windows/Microsoft.NET/Framework64/v2.0.50727/mscorlib.dll
----------------------------------------
Microsoft.PowerShell.ConsoleHost
    アセンブリ バージョン: 1.0.0.0
    Win32 バージョン: 6.1.7600.16385
    コードベース: file:///C:/Windows/assembly/GAC_MSIL/Microsoft.PowerShell.ConsoleHost/1.0.0.0__31bf3856ad364e35/Microsoft.PowerShell.ConsoleHost.dll
----------------------------------------
System
    アセンブリ バージョン: 2.0.0.0
    Win32 バージョン: 2.0.50727.8686 (QFE.050727-8600)
    コードベース: file:///C:/Windows/assembly/GAC_MSIL/System/2.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
System.Management.Automation
    アセンブリ バージョン: 1.0.0.0
    Win32 バージョン: 6.1.7601.17514
    コードベース: file:///C:/Windows/assembly/GAC_MSIL/System.Management.Automation/1.0.0.0__31bf3856ad364e35/System.Management.Automation.dll
----------------------------------------
Microsoft.PowerShell.Commands.Diagnostics
    アセンブリ バージョン: 1.0.0.0
    Win32 バージョン: 6.1.7601.17514
    コードベース: file:///C:/Windows/assembly/GAC_MSIL/Microsoft.PowerShell.Commands.Diagnostics/1.0.0.0__31bf3856ad364e35/Microsoft.PowerShell.Commands.Diagnostics.dll
----------------------------------------
System.Core
    アセンブリ バージョン: 3.5.0.0
    Win32 バージョン: 3.5.30729.5420 built by: Win7SP1
    コードベース: file:///C:/Windows/assembly/GAC_MSIL/System.Core/3.5.0.0__b77a5c561934e089/System.Core.dll
----------------------------------------
System.Configuration.Install
    アセンブリ バージョン: 2.0.0.0
    Win32 バージョン: 2.0.50727.5483 (Win7SP1GDR.050727-5400)
    コードベース: file:///C:/Windows/assembly/GAC_MSIL/System.Configuration.Install/2.0.0.0__b03f5f7f11d50a3a/System.Configuration.Install.dll
----------------------------------------
Microsoft.WSMan.Management
    アセンブリ バージョン: 1.0.0.0
    Win32 バージョン: 6.1.7601.17514
    コードベース: file:///C:/Windows/assembly/GAC_MSIL/Microsoft.WSMan.Management/1.0.0.0__31bf3856ad364e35/Microsoft.WSMan.Management.dll
----------------------------------------
System.Transactions
    アセンブリ バージョン: 2.0.0.0
    Win32 バージョン: 2.0.50727.5483 (Win7SP1GDR.050727-5400)
    コードベース: file:///C:/Windows/assembly/GAC_64/System.Transactions/2.0.0.0__b77a5c561934e089/System.Transactions.dll
----------------------------------------
Microsoft.PowerShell.Commands.Utility
    アセンブリ バージョン: 1.0.0.0
    Win32 バージョン: 6.1.7601.17514
    コードベース: file:///C:/Windows/assembly/GAC_MSIL/Microsoft.PowerShell.Commands.Utility/1.0.0.0__31bf3856ad364e35/Microsoft.PowerShell.Commands.Utility.dll
----------------------------------------
Microsoft.PowerShell.Commands.Management
    アセンブリ バージョン: 1.0.0.0
    Win32 バージョン: 6.1.7601.17514
    コードベース: file:///C:/Windows/assembly/GAC_MSIL/Microsoft.PowerShell.Commands.Management/1.0.0.0__31bf3856ad364e35/Microsoft.PowerShell.Commands.Management.dll
----------------------------------------
Microsoft.PowerShell.Security
    アセンブリ バージョン: 1.0.0.0
    Win32 バージョン: 6.1.7601.17514
    コードベース: file:///C:/Windows/assembly/GAC_MSIL/Microsoft.PowerShell.Security/1.0.0.0__31bf3856ad364e35/Microsoft.PowerShell.Security.dll
----------------------------------------
Microsoft.PowerShell.ConsoleHost.resources
    アセンブリ バージョン: 1.0.0.0
    Win32 バージョン: 6.1.7600.16385
    コードベース: file:///C:/Windows/assembly/GAC_MSIL/Microsoft.PowerShell.ConsoleHost.resources/1.0.0.0_ja_31bf3856ad364e35/Microsoft.PowerShell.ConsoleHost.resources.dll
----------------------------------------
System.Xml
    アセンブリ バージョン: 2.0.0.0
    Win32 バージョン: 2.0.50727.5494 (Win7SP1GDR.050727-5400)
    コードベース: file:///C:/Windows/assembly/GAC_MSIL/System.Xml/2.0.0.0__b77a5c561934e089/System.Xml.dll
----------------------------------------
System.Management
    アセンブリ バージョン: 2.0.0.0
    Win32 バージョン: 2.0.50727.5483 (Win7SP1GDR.050727-5400)
    コードベース: file:///C:/Windows/assembly/GAC_MSIL/System.Management/2.0.0.0__b03f5f7f11d50a3a/System.Management.dll
----------------------------------------
System.DirectoryServices
    アセンブリ バージョン: 2.0.0.0
    Win32 バージョン: 2.0.50727.5483 (Win7SP1GDR.050727-5400)
    コードベース: file:///C:/Windows/assembly/GAC_MSIL/System.DirectoryServices/2.0.0.0__b03f5f7f11d50a3a/System.DirectoryServices.dll
----------------------------------------
System.Management.Automation.resources
    アセンブリ バージョン: 1.0.0.0
    Win32 バージョン: 6.1.7600.16385
    コードベース: file:///C:/Windows/assembly/GAC_MSIL/System.Management.Automation.resources/1.0.0.0_ja_31bf3856ad364e35/System.Management.Automation.resources.dll
----------------------------------------
Microsoft.WSMan.Management.resources
    アセンブリ バージョン: 1.0.0.0
    Win32 バージョン: 6.1.7601.17514
    コードベース: file:///C:/Windows/assembly/GAC_MSIL/Microsoft.WSMan.Management.resources/1.0.0.0_ja_31bf3856ad364e35/Microsoft.WSMan.Management.resources.dll
----------------------------------------
mscorlib.resources
    アセンブリ バージョン: 2.0.0.0
    Win32 バージョン: 2.0.50727.5485 (Win7SP1GDR.050727-5400)
    コードベース: file:///C:/Windows/Microsoft.NET/Framework64/v2.0.50727/mscorlib.dll
----------------------------------------
Microsoft.PowerShell.Security.resources
    アセンブリ バージョン: 1.0.0.0
    Win32 バージョン: 6.1.7601.17514
    コードベース: file:///C:/Windows/assembly/GAC_MSIL/Microsoft.PowerShell.Security.resources/1.0.0.0_ja_31bf3856ad364e35/Microsoft.PowerShell.Security.resources.dll
----------------------------------------
System.Data
    アセンブリ バージョン: 2.0.0.0
    Win32 バージョン: 2.0.50727.8692 (QFE.050727-8600)
    コードベース: file:///C:/Windows/assembly/GAC_64/System.Data/2.0.0.0__b77a5c561934e089/System.Data.dll
----------------------------------------
System.Windows.Forms
    アセンブリ バージョン: 2.0.0.0
    Win32 バージョン: 2.0.50727.5491 (Win7SP1GDR.050727-5400)
    コードベース: file:///C:/Windows/assembly/GAC_MSIL/System.Windows.Forms/2.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System.Drawing
    アセンブリ バージョン: 2.0.0.0
    Win32 バージョン: 2.0.50727.5495 (Win7SP1GDR.050727-5400)
    コードベース: file:///C:/Windows/assembly/GAC_MSIL/System.Drawing/2.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
Accessibility
    アセンブリ バージョン: 2.0.0.0
    Win32 バージョン: 2.0.50727.5483 (Win7SP1GDR.050727-5400)
    コードベース: file:///C:/Windows/assembly/GAC_MSIL/Accessibility/2.0.0.0__b03f5f7f11d50a3a/Accessibility.dll
----------------------------------------
System.Windows.Forms.resources
    アセンブリ バージョン: 2.0.0.0
    Win32 バージョン: 2.0.50727.5420 (Win7SP1.050727-5400)
    コードベース: file:///C:/Windows/assembly/GAC_MSIL/System.Windows.Forms.resources/2.0.0.0_ja_b77a5c561934e089/System.Windows.Forms.resources.dll
----------------------------------------
************** JIT デバッグ **************
Just-In-Time (JIT) デバッグを有効にするには、このアプリケーション、
またはコンピュータ (machine.config) の構成ファイルの jitDebugging
値を system.windows.forms セクションで設定しなければなりません。
アプリケーションはまた、デバッグを有効にしてコンパイルされなければ
なりません。
例:
<configuration>
    <system.windows.forms jitDebugging="true" />
</configuration>
JIT デバッグが有効なときは、このダイアログ ボックスで処理するよりも、
ハンドルされていない例外はすべてコンピュータに登録された
JIT デバッガに設定されなければなりません。

指定したデータストアがローカルディスクなのかを判定する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 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」の方を行う必要があるようだ。

そんなわけで、スクリプト例は下記の様になる。

$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
}

ハードウェア版マウスふるふる(Arduino Leonardo互換のCJMCU beetleの工作例)


CJMCU Beetleという小型のUSB接続のマイコンボードに標準で書かれているプログラムは、USBキーボード/マウスとして認識し、マウスをランダムで動かすという機能となっているらしいので入手してみた。

ネタ元: Okiraku Programing「USB直結のスクリーンセーバーブロッカー

購入はAliexpressの「Beetle ard Leonardo USB ATMEGA32U4 mini development board」から行った。
送料込みで$7.78で、8/22発注、8/25発送、9/1到着、という感じで届きました。


とりあえずWindows10パソコンに接続してみる。
devicemanager-1

標準でfirmware書き換え用のUSBシリアルポートを認識するというのも驚いた。
(Windows7ではドライバ認識はしなかった)

USBキーボードとマウスが認識されてはいるんだが、期待通りにマウスが小刻みに動いている場合と、全然動かない場合が・・・というか、動かないことの方が多い・・・
また、赤いLEDランプが点灯期間が長めの点滅でちょっとうざい。

もうちょっとなんとかならないかとカスタマイズを実施。

準備1:Arduino IDEをインストール
準備2:ボード「Arduino Leonardo」を選択
準備3:CJMCU beetleをUSBポートにさして認識されるのを待つ(ドライバにより認識が変わる)
 devicemanager-2
準備4:シリアルポートで適切なものを選ぶ
準備5:「Get Board Info」で「BN:Arduino Leonardo」と表示されることを確認
 2016-09-02 (4)

コードとして下記を入力する

#include <Mouse.h>
#define LEDPIN 13
void setup() {
  pinMode(LEDPIN, OUTPUT);
  Mouse.begin();
}
int x=4;
void loop() {
  // put your main code here, to run repeatedly:
  Mouse.move(x, 0, 0);
  digitalWrite(LEDPIN, HIGH);   // turn the LED on
  delay(500);
  digitalWrite(LEDPIN, LOW);   // turn the LED off
  x = -x;
  delay(4500);
}

スケッチ-マイコンボードに書き込むで書き込みを実施。

これは5秒間隔でマウスを動かし、また、動かす際にLEDを短時間点灯させる、というものになっています。
点灯させたくなければ「digitalWrite」の行を削除すればokです。