hakeの日記

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

powershell

PowerShell Core

バージョン6以降のものをこう呼ぶようになったみたい。 一番の大きな変更はlinuxやmacでも動作するようになったこと。 現時点でも最新バージョンは6.1.0で、早速、リリースサイトからPowerShell-6.1.0-win-x64.msiをダウンロードしてきてインストール。 Wind…

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

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

PowerShell - 音量のコントロール

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

PowerShell - スクリプトブロック

以下の様に、スクリプトブロックを変数に代入できる。呼び出しは変数に"&"を付加する。 なので高階関数のようなことも可能になります。 $plus1 = { param( $a ) return $a + 1 } # 第一引数にスクリプトブロック # 第二引数にリスト function map($fn, $list…

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 "" } …

PowerShell - 簡易GUI電卓

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

PowerShell - Internet Explorerの操作

Internet Explorerを起動して、Googleで"PowerShell"を検索してみる。 ただ、起動したIEのウィンドウを最前面にもってくる方法がわからない。 $keyword = "PowerShell" $ie = New-Object -ComObject InternetExplorer.Application $ie.Visible = $true $ie.N…

PowerShell - Sort-Object - 1から10の数字を、2.1に近い順に並べかえる

1..10 | Sort-Object @{ Expression={[MATH]::Abs($_ - 2.1)}; Ascending = $true # expressionブロックの値が小さい順 } 実行結果 2 3 1 4 5 6 7 8 9 10

PowerShell - ForEach-Objectの多重使用 - CSVファイルを読み取りデータに1を加算して出力する

Get-Content ".\test.csv" | %{ ( # 1行ごとの処理 $_ -split "," | %{ # 1データごとの処理 [int]$_ + 1 } ) -join "," } | Write-Output test.csv 1,2,3 4,5,6 7,8,9 結果 2,3,4 5,6,7 8,9,10 普通のプログラムっぽい書き方(ForEach-Objectは使用しない)…

PowerShell - Excelの操作

EXCEL用のCOMオブジェクトを作成して、あとはVBAと同じ感覚で操作できるっぽいです。 一点、配列やコレクションの括弧の形状がVBAだと( )ですが、[ ]にしないとメソッドと間違えられてエラーになるので注意。 $excel = New-Object -ComObject Excel.Applicat…

PowerShell - GUIプログラム

ボタンをクリックすると文字を表示するプログラム。 デフォルトで使用できないクラスは、Add-Typeで読み込む。Formに設定したフォントはForm上の部品にも適用される。イベント登録はAdd_イベント名(処理)と記述する。 System.Windows.Forms.Formクラス - M…

PowerShell - クラス

バージョン5からクラスが使用可能になったようです。 class Person { [string] $name [int] $age # コンストラクタ Person() { $this.name = "No Name" $this.age = 0 } Person([string]$name, [int]$age) { $this.name = $name $this.age = $age } # メソッ…

PowerShell - クロージャ

戻り値となるブロック内の変数$cntをscriptスコープ宣言することでfunction内の変数$cntへアクセスできるようになる? function generator($step = 1){ $cnt = 0 return { $script:cnt += $step return $cnt }.GetNewClosure() } $a = generator &($a) # 1 &…

PowerShell - 独自オブジェクトの作成

PSObjectにプロパティやメソッドを追加していくことで独自のオブジェクトが作成できます。 # Hashでプロパティを追加 $hash = @{name = "Taro"; age = 20} $obj = New-Object PSObject -Property $hash # Add-Memberでプロパティを追加 $obj | Add-Member -M…

PowerShell - 例外処理

try節のブロックで例外が発生した場合、(該当する型を記述した)catch節が実行される。finally節は例外発生有無に関わらず実行される。 try { "try節です" 1/0 } catch [Exception] { "catch節です" } finally { "finary節です" }try節です catch節です fin…

PowerShell - 例外処理(throw)

意図的に例外を発生させる場合にはthrowを使用する。 try { "try節です" throw "例外発生" } catch [Exception] { "catch節です" } finally { "finary節です" }PS C:\> $error[0].CategoryInfo Category : OperationStopped Activity : Reason : RuntimeExce…

PowerShell - 関数(値渡しと参照渡し)

参照渡しの場合、呼び出し側の引数に[ref]をつける、また引数に括弧がないとエラーになった。 関数定義の仮引数の[ref]は無くても良い、関数内では仮引数のValueプロパティにアクセスする。 # 値渡し function byVal($arg){ $arg = "Good Bye" Write-Host "i…

PowerShell - 関数(パイプ)

パイプで渡されるてくるデータの処理用の関数。 開始処理はbeginブロック、終了処理はendブロック、渡されてくるデータの処理はprocessブロックに記述する。渡されてきたデータは変数$_に格納されている。 returnで値を返すと関数の出力になる。 even.ps1 fu…

PowerShell - 関数(可変長引数)

引数は変数$argsという配列にわたされる。 test.ps1 function foo { $args.GetType() foreach( $i in $args ) { Write-Host $i } } 結果 PS C:\> . C:\test.ps1 # 関数読み込み PS C:\> foo 1 2 3 IsPublic IsSerial Name BaseType -------- -------- ---- -…

PowerShell - 再帰関数

function fact($i) { if($i -eq 0) { return 1 } else { return $i * (fact ($i - 1)) } } fact 5 # 120 2017/1/28追記 再帰回数に限界がある模様 Win10 PowerShell 5.1の環境で、以下の関数fooの引数が1000の場合は正常終了しましたが、5000の場合はエラー…

PowerShell - 文字列

変数展開 PS C:\> $a = "Hello " PS C:\> "${a} world" # " "で囲まれた中の変数は展開される Hello world PS C:\> '${a} world' # ' 'で囲まれた中の変数は展開されない ${a} world 部分式 PS C:\> $a = 100 PS C:\> "$($a + 1) is 101" 101 is 101 ヒアド…

PowerShell - 正規表現

match演算子 変数$Matchesでマッチした文字列を取得できる。要素0がマッチした文字列、要素1以降が部分マッチ(キャプチャ)された文字列になる。 ただし最初にマッチしたものしか得られないみたい。 PS C:\> "abcde" -match "(.)(.)" True PS C:\> $Matches…

PowerShell - 制御構造(条件分岐)

if if(条件){ 文 } elseif(条件){ 文 } else { 文 } switch switch($v){ 1 {文; break} 2 {文; break} ($_ -ge 3) {文; break} default {文; break} } # 正規表現 (-matchでないことに注意) $s = "abcd" switch -Regex($s){ "^a" {Write-Host 1;break} # aで…

PowerShell - 制御構造(ループ)

for for($i = 0; $i -lt 5; $i++){ Write-Host $i } 0 1 2 3 4 foreach foreach($i in (0..4)){ Write-Host $i } 0 1 2 3 4 while / do while $i = 0 while($i -lt 5){ Write-Host $i $i++ } 0 1 2 3 4 $i = 0 do { Write-Host $i $i++ }while($i -lt 5) 0 1…

PowerShell - データと変数の型

文字と数値が混ざった式は、左の型に合わせる? でにキャスト?すれば変換できるっぽい PS C:\> 1 + "1" 2 PS C:\> "1" + 1 11 PS C:\> [long]"1" + 1 2 変数の型 最初に使用するときに型の宣言をすれば、その型の変数になる。 使用をやめるときはRemove-Var…

PowerShell - ファイル/フォルダリストの取得

バージョン 5.1 PS C:\> Get-ChildItem -File PS C:\>Get-ChildItem -Directory バージョン 2.0 PSIsContainerプロパティ?がTrueならフォルダ、FalseならファイルなのでWhere-Objectで抽出する。 バージョン5.1でも使用可能。 PS C:\> Get-ChildItem | Wher…

PowerShell - テキストファイルの読み書き

書き込みはOut-Fileを使用する。文字列はパイプで渡すか、-InputObjectでオブジェクトを渡す。-Appendで追加書き込み。 読み込みはGet-Contentを使用する。各行毎の文字列の配列として変数に読み込まれる。ただし1行のみのファイルはStringになるため、GetTy…

PowerShell - 配列

代入 PS C:\> $ary = 1,2,3,4,5 PS C:\> $ary = 1 .. 5 PS C:\> $ary = @() #空配列 PS C:\> $ary = @(1,2,3,4,5) PS C:\> $ary = "abcdefg" -split "" # 1文字ずつに分割(前後に空文字の要素が入る) PS C:\> $ary = "abcdefg" -split "\B" # 1文字ずつに…

PowerShell - 連想配列

代入と参照 PS C:\> $h = @{"a" = 1; "b" = 2} PS C:\> $h["c"] = 3 PS C:\> $h Name Value ---- ----- c 3 a 1 b 2 PS C:\> $h["a"] 1 PS C:\> $h["z"] -eq $null # 存在しないキーでは$nullが返る True キーおよび値の配列取得 PS C:\> $ks = $h.Keys PS C…

PowerShell - 実行環境の設定、その他

次期のWindowsのアップデートでデフォルトがコマンドプロンプトからPowerShellに代わるそうなので学習開始です。 実行ポリシーの変更 デフォルトでは実行できなようになっている為、実行ポリシーを変更する必要がある。 一時的に変更してスクリプトを実行 コ…