hakeの日記

Windows環境でプログラミングの勉強をしています。

PowerShell - C#で記述したオブジェクトを使用する

こちらで使用している内容の再確認。
C#のソースを埋め込んで、定義したクラスをオブジェクトとして利用する。

Add-Type -TypeDefinition @'

using System;

public class MyClass
{
    public int Data {set; get;}

    public void PrintInstance()
    {
        Console.WriteLine("Instans");
    }

    public static void PrintStatic()
    {
        Console.WriteLine("Static");
    }
}

'@


[MyClass]::PrintStatic()  # Static

$m = New-Object MyClass
$m.PrintInstance()        # Instance
$m.Data = 10
$m.Data                   # 10

PowerShell Core

バージョン6以降のものをこう呼ぶようになったみたい。
一番の大きな変更はlinuxmacでも動作するようになったこと。
現時点でも最新バージョンは6.1.0で、早速、リリースサイトからPowerShell-6.1.0-win-x64.msiをダウンロードしてきてインストール。
Windows 10に元々インストールされていた5.1とは併存可能みたい。5.1はスタートメニューの「W」(Windows Power Shell)の欄にあるのに対して、6.1.0は「P」(Power Shell)の欄にありました。
インストールされたのはコンソールのみで、今までの様なPowerShell ISEはないです。

あと、コマンドプロンプトからの起動名称がpwsh変わっていました。

PS C:\> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      6.1.0
PSEdition                      Core
GitCommitId                    6.1.0
OS                             Microsoft Windows 10.0.17134 
Platform                       Win32NT
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0

 

関連書籍

PowerShell - バッチファイル内に記述したスクリプトを実行する。

バッチファイル内にPowerShellスクリプトを記述して実行させる方法を知ったのでメモ。
この方法だとExecutionPolicyに関係なく実行できる様なので、普段PowerShellを使用していないPCでも実行可能になる。

記述方法

バッチファイル1行目に以下を記述し、2行目以降にはPowerShellスクリプトを記述する。コマンドライン引数は$argsで取得できる。

@setlocal enableextensions enabledelayedexpansion & set "SELF=%~f0" & PowerShell.exe -Command "& (Invoke-Expression -Command ('{#' + ((Get-Content '!SELF:'=''!') -join \"`n\") + '}'))" %* & exit /b !errorlevel!

# 以下実行させたいPowerShellスクリプト

構造

  • バッチコマンドを&で連結して1行で記述
  • バッチファイルのパスを取得し、ローカルな環境変数SELFに格納
  • PowerShell.exe -Command Script %* でスクリプト実行
  • exit /bでバッチ終了
PowerShell.exe -Command Scriptの内容
  • Get-Contentで環境変数SELF(バッチファイル自身)の内容取得(この際「'」を「''」に置換)
  • 取得した内容(行単位の配列)を改行コードで連結してひとつの文字列にする
  • 頭に#を追加して、バッチファイル1行目を(PowerShellの)コメントにする
  • Invoke-Expressionで実行

PowerShell - 音量のコントロール

PowerShellからボリュームコントロールできる情報を見つけたのでメモ。VolumeとMuteプロパティへのアクセスができるようになる。
Windows7PowerShell Ver.2の場合は、1行目を以下の様に変更する。

Add-Type -Language CSharpVersion3 -TypeDefinition @'
続きを読む

PowerShell - スクリプトブロック

以下の様に、スクリプトブロックを変数に代入できる。呼び出しは変数に"&"を付加する。
なので高階関数のようなことも可能になります。

$plus1 = {
    param( $a )
    return $a + 1
}

# 第一引数にスクリプトブロック
# 第二引数にリスト
function map($fn, $list){
    
    $list | %{ return &$fn $_ }
}


map $plus1 @(1,2,3)
# => 2
#    3
#    4

PowerShell - SHA256ハッシュ値文字列の取得

function getSHA256Hash( [string]$s ){
    $sha256 = New-Object System.Security.Cryptography.SHA256Managed
    $utf8   = New-Object System.Text.UTF8Encoding

    $h = $sha256.ComputeHash( $utf8.GetBytes($s) )

    return ($h | %{$_.ToString("x2")}) -join ""
}

Write-Host $(getSHA256Hash "") # 空文字
# e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Write-Host $(getSHA256Hash "あ")
# dc5a4d3d82f7e15792959dc661538ae0e541ce66494516f5c9cfd9cd3308494d

PowerShell - 簡易GUI電卓

簡単なGUI電卓を作成。
少々悩んだ点として、関数内でグローバル変数にアクセスする場合は、$varを$global:varとすること。でも、本当は引数経由でアクセスしたほうが良いのですが……。
あとボタンオブジェクトは、配列で処理するとソースがもっとすっきりするはず。

ソース

続きを読む