crossframe » PowerShell http://crossframe.iiv.jp Windows Dev. Site Tue, 07 Nov 2023 06:31:52 +0000 ja hourly 1 https://wordpress.org/?v=3.8.41 PowerShell / Linux ../../../201608201216/ ../../../201608201216/#comments Sat, 20 Aug 2016 05:24:24 +0000 ../../../?p=1216 LinuxやMac用のPowerShellがマイクロソフトからリリースされました。
パイプ処理やリモート機能などLinuxでも使えたら便利と思っていたので、ずっと期待していました。
早速インストールして、試してみました。

環境: Ubuntu 16.04
下記よりUbuntu用をダウンロードして、dkpg -i でパッケージインストール。

https://github.com/PowerShell/PowerShell/releases/tag/v6.0.0-alpha.9

バージョン表示
linuxps01

リモート設定
linuxps02
まだ無理なのでしょうか・・

Apache2のプロセス表示
linuxps03
aliasを見てみると lsにはなにも割り当てられていません。
またおいおい試していきたいです。

]]>
../../../201608201216/feed/ 0
PowerShell RunspacePool ../../../201607031210/ ../../../201607031210/#comments Sun, 03 Jul 2016 08:13:40 +0000 ../../../?p=1210 パワーシェルコマンドを非同期で並列に実行するテストです。時間を表示して並行に実行していることを確認しました。

環境: PowerShell version 5 / Windows 10

$PSVersionTable
Set-ExecutionPolicy RemoteSigned

(ポリシー変更を管理者権限で実行)

実行画面
powershell_run01

runtest.ps1

$cmds = @(
 "sleep 1; get-date", 
 "sleep 2; get-date", 
 "sleep 3; get-date" 
 )

$len = $cmds.Length
$pool = [RunspaceFactory]::CreateRunspacePool(1, $len)
$pool.Open()
$arrPs  = New-Object System.Collections.ArrayList
$arrRes  = New-Object System.Collections.ArrayList
for ( $i = 0; $i -lt $len; $i++ ) {
	$cmd = $cmds[$i]
	$ps = [PowerShell]::Create()
	$ps.RunspacePool = $pool
	$ps.AddScript($cmd) | Out-Null
	# $ps.AddCommand("Out-String") 
	$res = $ps.BeginInvoke()
	$arrPs.Add($ps) | Out-Null
	$arrRes.Add($res) | Out-Null
}

while ( $arrPs.Count -gt 0 ){
	for ( $i = 0; $i -lt $arrPs.Count; $i++ ){
		$ps = $arrPs[$i]
		$res = $arrRes[$i]
		if($ps -ne $null){
			if($res.IsCompleted){
				$result = $ps.EndInvoke($res)
				Write-host $result
				$ps.Dispose()
				$arrPs.RemoveAt($i)
				$arrRes.RemoveAt($i) 	
			}
		}
	}
}
$pool.Close()

参考: https://www.gmo.jp/report/single/?art_id=195

]]>
../../../201607031210/feed/ 0
Auto Generated Example-Driven Parsing ../../../201512161157/ ../../../201512161157/#comments Wed, 16 Dec 2015 13:49:46 +0000 ../../../?p=1157 こんなことができるコマンドがPowerShellにあるとは知りませんでした。
任意のテキストをある規則性に基づいて自動的に整形してくれるものです。
規則については元のテキストの一部を利用してテンプレートをつくるだけです。

decodeブログ(http://decode.red/blog)のフィードを使ってテストをしてみました。

環境: PowerShell 5.0 / Windows 10
feed.txt

Geohash
2015年12月4日 23:51
ジオコード(地理座標)の一つで、緯度と経…
Entropy
2015年11月2日 23:04
エントロピーという熱力学で使われる概念は…
Haskell for Mac
2015年10月17日 16:08
関数型言語Haskellに、Xcodeの…
FPGA & GPU/OpenCL
2015年9月13日 13:22
インテルによるアルテラ買収のニュースは、…
Word Cloud / D3.js
2015年8月30日 19:36
前回のword2vecで利用したテキスト…
Word To Vector
2015年8月23日 18:05
以前から気になっていたword2vecを…
Signal Processing Toolkit
2015年7月8日 23:16
音声データをコマンドツールだけで処理でき…
Mathematica / Raspberry Pi 2
2015年6月27日 22:13
あのRaspberry Pi 2をようや…
Multi Layer Perceptron
2015年5月17日 22:13
ニューラルネットワークが簡単に実装できる…
Evaluate Code
2015年5月2日 13:24
コードを文字列データとして与え、プログラ…

これの一部を使って作ったのが下のテンプレートで、以下コマンドを実行します。

$templ=@’
{title*:Geohash}
{date:2015年12月4日} {time:23:51}
{description:ジオコード(地理座標)の一つで、緯度と経…}
{title*:Signal Processing Toolkit}
{date:2015年7月8日} {time:23:16}
{description:音声データをコマンドツールだけで処理でき…}
‘@

Get-Content .\feed.txt | ConvertFrom-String -TemplateContent $templ | Format-Table -AutoSize title, date, time, description

テンプレートの選び方によって結果も違ってくるので、いろいろと試す必要はあります。
実行結果
powershell01

なかなか面白いです。
ひさびさのPowerShellでした。やはりPowerShellいいですね。

参考:

http://www.powershellmagazine.com/2014/09/09/using-the-convertfrom-string-cmdlet-to-parse-structured-text/

]]>
../../../201512161157/feed/ 0
Access .mdb / PowerShell ../../../20141102865/ ../../../20141102865/#comments Sun, 02 Nov 2014 05:22:31 +0000 ../../../?p=865 AccessのmdbファイルをPowerShellで読み込むテストをしてみました。
ファイルベースのDBで簡単にデータをプログラムで活用するために、とても便利です。

環境 : Access 2013, PowerShell 4.0 / Windows 8.1 64bit
まずからの空のmdbファイルをせっかくなので、PowerShellでつくりました。
ここで注意することは、32bit版のPowerShellを使う必要があることです。

$para = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='C:\work\sample01.mdb'"
$obj = New-Object -ComObject "ADOX.Catalog"
$mdb = $obj.Create($para)
$mdb.Close()

これをAccessで開き、適当なテーブルを作成します。
access01

Accessは開いたまま下記コマンドを実行できます。
select01.ps1

$conn = New-Object -comobject ADODB.Connection  
$rset = New-Object -comobject ADODB.Recordset  
  
$conn.Open("Provider = Microsoft.Jet.OLEDB.4.0; Data Source = C:\work\sample01.mdb")  
$rset.Open("Select * from table1", $conn)
$rset.MoveFirst()  
do {
	$rset.Fields.Item("item1").Value;
	$rset.MoveNext()
} until ($rset.EOF -eq $True)  
  
$rset.Close()  
$conn.Close() 

access02

32bit版のPowerShellをショートカットにして、起動したところです。

参考:

http://hidori.jp/blog/2013/04/03/610

https://gallery.technet.microsoft.com/office/a4a0ade2-e856-48ff-9e91-31b4b6356382

]]>
../../../20141102865/feed/ 0
Background Inteligent Transfer Service ../../../20140927828/ ../../../20140927828/#comments Sat, 27 Sep 2014 13:35:18 +0000 ../../../?p=828 BITSというPowerShellのファイルの分割ダウンロードをやってみました。
本当に分割リクエストをしているのか、また途中でサスペンドして、レジュームで継続してダウンロードするか、をApacheを使って確認しました。

環境 : PowerShell 2.0 / Windows 7 (192.168.11.10), apache2 / Ubuntu 14.04 (192.168.11.14)
Webサーバの準備。

dd if=/dev/zero of=dummy.zip bs=1M count=200

ダミーファイルを/var/www/htmlに作成。

LogFormat “%h %l %u %t \”%r\” %>s %O \”%{Range}i\”" combined

レンジがわかるように/etc/apache2/apache2.confのLogFormatを変更。

tail -f /var/log/apache2/access.log

でログ確認。サスペンドは20秒ほど。(改行部分)

BTS02

転送が始まって、少ししたら、サスペンド、そしてレジューム。
サスペンドするために、非同期で実行。

BTS01

レンジが指定できないようなのが、ちょっと不便な気がします。自動的に調整しているみたい。
サスペンドして、Windows7を再起動後、レジュームしても途中からダウンロードしました。
巨大ファイルを何日かかけてダウンロードする用途があるときは、便利。

]]>
../../../20140927828/feed/ 0
PowerShell DSC / Hyper-V ../../../20140906819/ ../../../20140906819/#comments Sat, 06 Sep 2014 04:47:59 +0000 ../../../?p=819 PowerShell 4.0の新しい機能である、Desired State Configurationを使ってみました。

参考:PowerShell DSCによるプッシュ型展開

http://www.atmarkit.co.jp/ait/articles/1407/24/news131.html

このDSCというのは、サーバの設定を自動的にするしくみで、リモートホストとPushおよびPull通信をします。

ここでは、Windows Server 2012R2のHyper-VにWindows 8.1を仮想化した環境で、2012R2から8.1へのPushをテストしました。
設定するものは、ファイルリソースを使って、メッセージを指定のフォルダに書き込み見ます。

8.1側は以下の設定を事前にします。

Enable-PSRemoting -Force
Set-Item wsman:\localhost\Client\TrustedHosts -Value * -Force
Set-ExecutionPolicy RemoteSigned

hello.ps1

Param([string]$msg)

Configuration DSCTest
{
    Node "192.168.11.11"
    {
        File dscFile
        {
            DestinationPath = "C:\work\hello.txt"
            Ensure = "Present"
            Type = "File"
            Contents = $msg
        }
    }
}
$outputPath = ".\DSCTest"
DSCTest -OutputPath $outputPath
Start-DscConfiguration -Path $outputPath -Wait -Verbose -Credential 192.168.11.11\user

結果
dsc01

冪等性から、何度設定しても同じ状態になる特徴がありますが(同じ状態だと何もしない)、
上のようにメッセージを引数で変えてやると、毎回設定にいくようです。

対象ノードは複数設定でき、いろいろと応用した使い方ができそうです。

]]>
../../../20140906819/feed/ 0
PowerShellでLDAP ../../../20140810787/ ../../../20140810787/#comments Sun, 10 Aug 2014 02:12:39 +0000 http://xfra.me/?p=787 LDAPのデータ操作をPowerShellでやってみました。ActiveDirectoryでも同様にできると思いますが、汎用性と導入のしやすさを考えて、OpenLDAPを使いました。

環境 : PowerShell 2.0 / Windows 7 <-> OpenLDAP 2.4.31 / Ubuntu 14.04 LTS

OpenLDAPのインストールは以下のコマンドを実行しただけ。

apt-get install ldap-utils
apt-get install slapd

自動で起動し、使用可能となります。
認証は、cn=admin,dc=nodomain / password
ホスト名は設定していないので、nodomainのままですが、これで使えるようになるのはスゴイ!
テスト前に、データを適当に作成しておきます。(ldapmodifyでもいいですが、ApacheDirectoryStudioを使用)

まずデータの参照から。

$domain = "LDAP://192.168.11.11:389/dc=nodomain"
$auth = [System.DirectoryServices.AuthenticationTypes]::FastBind
$root = New-Object System.DirectoryServices.DirectoryEntry($domain,"cn=admin,dc=nodomain", "password", $auth)
$query = New-Object System.DirectoryServices.DirectorySearcher($root,"(objectclass=*)")
$entries = $query.FindAll()
$entries | %{$_.Properties}
$entries[5] | %{$_.Properties}
$entries[5] | %{$_.Properties["cn"]}
$entries[5] | %{$_.Properties}).PropertyNames

ldap01

更新対象のuser02のデータのみを確認してみます。
ldap02

次に、属性の追加・更新。

$query = New-Object System.DirectoryServices.DirectorySearcher($root,"(&(objectclass=*)(uid=user02))")
$entry = $query.FindOne().GetDirectoryEntry()
$entry.description.Value="Add Value by PS"
$entry.SetInfo()
$entry.givenname.Value="Edit Test"
$entry.SetInfo()

$query.FindOne() | %{$_.Properties}

ldap03

user02にデータが更新されていることが確認できます。

LDAPデータをPowerShellオブジェクトとして扱えるのは便利。

]]>
../../../20140810787/feed/ 0
PowerShellでJSON ../../../20140809781/ ../../../20140809781/#comments Sat, 09 Aug 2014 05:23:35 +0000 http://xfra.me/?p=781 PowerShellには、PowerShellオブジェクトとJSONデータを相互に変換できる便利なコマンドレットがあります。

ConvertTo-Json
ConvertFrom-Json

今回のテストで使うJSONデータは、WebからPowerShellで取得します。
今日は台風ということもあって、天気情報を取得してみたいと思います。
情報元は、ライブドア天気情報の名古屋地区のものです。

環境: PowerShell ver3.0 / Windows 8

$wr = Invoke-WebRequest -uri http://weather.livedoor.com/forecast/webservice/json/v1?city=230010

($wr.Content | ConvertFrom-Json).description.text

wr01

wr02e

なかなか実用的なテストになりました。

]]>
../../../20140809781/feed/ 0
Multithreading PowerShell ../../../20140712773/ ../../../20140712773/#comments Sat, 12 Jul 2014 01:42:19 +0000 http://xfra.me/?p=773 PowserShellを使ったマルチスレッドをテストしてみました。
1秒から10秒までスリープするスレッド10個を同時に走らせています。
AddScript, AddArgmentによるパラメータ渡し、結果取得をイメージするため、2乗する演算をいれています。(手抜き感・・)
ソースは下記サイトにあるものを簡略化しました。

環境 : PSVersion 2.0 / Windows 7


$threads = 10
 
$scriptBlock = {
   Param (
      [int]$num
   )
   Start-Sleep -Seconds $num
   $res = New-Object PSObject -Property @{num=$num;num2=$num*$num}
   Return $res
}
 
$runspacePool = [RunspaceFactory]::CreateRunspacePool(1, $threads)
$runspacePool.Open()
$jobs = @()

1..10 | % {
   $job = 1::Create().AddScript($scriptBlock).AddArgument($_)
   $job.runspacePool = $runspacePool
   
   $jobs += New-Object PSObject -Property @{
      num = $_
      pipe = $job
      result = $job.BeginInvoke()
   }
}
ForEach ($job in $jobs)
{   
     $job.pipe.EndInvoke($job.result)
}

multiPS
結果が1行/1秒ごとに表示されるので、同時に走っていることが確認できます。
$threads数を絞ると、表示終了までにさらに時間がかかることも確認できます。

参考サイト : http://thesurlyadmin.com/2013/02/11/multithreading-powershell-scripts/

]]>
../../../20140712773/feed/ 0
MSMQ / PowerShell ../../../20140503733/ ../../../20140503733/#comments Fri, 02 May 2014 15:05:40 +0000 http://xfra.me/?p=733 ErlangつながりでRabitMQに興味をもち、別件でテストしていたとき、MSMQというWindows標準のメッセージキューシステムがWindowsにあることを知りました。(順序が逆か?)
そこでいろいろと調べてテストをしましたが、自分の思う形で動かすのに少し手こずりました。

環境 : Windows 7 & Windows 8.1

・ドメインモードとワークグループモードがあり、ワークグループモードでは、プライベートキューのみ
・リモート接続ではプライベートキューへの送信がサポートされていない(?)

といったことから、2台のPCで通信したかったのですが結局Windows7ローカルのみでテストすることにしました。

サーバ設定
msmq_c

送信側
msmq_s

受信側
msmq_r

PowerShellで簡単に実装できるので、いろんなケースで活用できそうです。
MSMQにかぎらず、MessageQueueはいろいろとホットなので、もう少し掘り下げてみたいです。

]]>
../../../20140503733/feed/ 0