ラベル PowerShell の投稿を表示しています。 すべての投稿を表示
ラベル PowerShell の投稿を表示しています。 すべての投稿を表示

2021年5月5日

【Linux】Linux Mint にWindows10のPowerShellでSSH接続する方法



ゴールデンウィークいかがお過ごしでしょうか。
私は特にどこにも行かず自宅に引きこもっています!笑
まあでも、ずっと家にいるのもストレスですね。早く以前のように自由に出歩けるようになってほしいです。

そんななか、自宅でLinuxを使ってサーバーの構築なんかをやってるんですけど、いろいろ調べてるなかでPowerShellをSSHクライアントとして使えることを初めて知りました。
試しにやってみましたので構築手順を備忘録として公開します。

最初にネットワーク構成です。

Linux Mintは余ってるPCにインストールしました。
バージョンは20.1です。
ホスト名はMOUSEMINT。

Windows10は、Pro バージョン20H2です。
ホスト名はMOUSEDAIV4N。

まずLinux側で作業します。


最初にLinuxのアップデートを行います。
$ sudo apt update

次にOpenSSH Serverをインストールします。
$ sudo apt install openssh-server

一応sshdが起動していることを確認します。
$ ps ax | grep sshd
 115240 ?        Ss     0:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
 116367 pts/1    S+     0:00 grep --color=auto sshd
大丈夫そうですね。

次にWindows側で作業していきます。


PowerShellを起動したらSSHでログイン出来るか試してみます。
PS C:\Users\hosopro> ssh hosopro@192.168.1.20
The authenticity of host '192.168.1.20 (192.168.1.20)' can't be established.
ECDSA key fingerprint is SHA256:C3Q0M5pSMhjpwkH6+C3UdvEeR5r3gkIrDSVPuRCddiI.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.20' (ECDSA) to the list of known hosts.
hosopro@192.168.1.20's password:
最初に「Are you sure you want to continue connecting (yes/no)?」と聞いてきますので「yes」と入力してEnter。
続いてパスワードを聞いてくるのでLinuxユーザーのパスワードを入力します。

ログイン出来たら一旦ログアウトします。
hosopro@MOUSEMINT:~$ logout
Connection to 192.168.1.20 closed.

再度SSHでアクセス。
PS C:\Users\hosopro> ssh hosopro@192.168.1.20
hosopro@192.168.1.20's password:
Last login: Sun May  2 18:15:50 2021 from 192.168.1.10
2回目からはパスワードだけでログインできます。

ここでホームディレクトリにworkフォルダを作成しておきます。
hosopro@MOUSEMINT:~$ mkdir work
このフォルダはあとで公開鍵を転送するときに使います。
フォルダの作成が出来たら一旦ログアウトします。

ログアウト出来たらホームディレクトリを確認してみます。
「.ssh」フォルダが出来ているのが確認できます。


次に秘密鍵と公開鍵の生成を行います。
PS C:\Users\hosopro> cd .ssh
PS C:\Users\hosopro\.ssh> ssh-keygen

ssh-keygenを実行すると、初めに「Enter file in which to save the key (C:\Users\hosopro/.ssh/id_rsa):」と表示されるのでEnterを押します。

次にパスフレーズをを聞いてきますので入力します。
このパスフレーズは公開鍵認証でSSH接続するときに使います。

パスフレーズは無しでもいいらしいのですが、安全上やはりあったほうがいいので設定します。 ちなみに10文字以上が推奨されています。

また通常のパスワードと違ってスペースも含めることができますので、自分が好きな歌詞の一節をフレーズとして使うなんてもいいんじゃないでしょうか。


.sshフォルダを見るとこのようにファイルが作成されているのが確認できます。


次に作成した公開鍵をLinux側に転送します。
保存先は先ほど作成した「work」フォルダです。
PS C:\Users\hosopro\.ssh> scp .\id_rsa.pub hosopro@192.168.1.20:/home/hosopro/work
hosopro@192.168.1.20's password:
id_rsa.pub                                                     100%  402    97.0KB/s   00:00

転送出来たらSSHでLinuxに接続します。
PS C:\Users\hosopro\.ssh> ssh hosopro@192.168.1.20
hosopro@192.168.1.20's password:
Last login: Sun May  2 18:39:36 2021 from 192.168.1.10

ログイン出来たらホームディレクトリに「.ssh」フォルダを作成します。
hosopro@MOUSEMINT:~$ mkdir .ssh

次にパーミッションを変更します。
hosopro@MOUSEMINT:~$ chmod 700 .ssh



次にworkフォルダに転送された公開鍵ファイルを.sshフォルダに移動します。
hosopro@MOUSEMINT:~$ mv ./work/id_rsa.pub ./.ssh/
hosopro@MOUSEMINT:~$ cd .ssh
hosopro@MOUSEMINT:~/.ssh$ ls -la
合計 12
drwx------  2 hosopro hosopro 4096  5月  2 18:56 .
drwxr-xr-x 23 hosopro hosopro 4096  5月  2 18:51 ..
-rw-rw-r--  1 hosopro hosopro  402  5月  2 18:45 id_rsa.pub

次に移動した公開鍵ファイルのファイル名を変更します。
hosopro@MOUSEMINT:~/.ssh$ mv id_rsa.pub authorized_keys
hosopro@MOUSEMINT:~/.ssh$ ls -la
合計 12
drwx------  2 hosopro hosopro 4096  5月  2 18:58 .
drwxr-xr-x 23 hosopro hosopro 4096  5月  2 18:51 ..
-rw-rw-r--  1 hosopro hosopro  402  5月  2 18:45 authorized_keys

次にauthorized_keysファイルのパーミッションを600に変更します。
hosopro@MOUSEMINT:~/.ssh$ chmod 600 authorized_keys
hosopro@MOUSEMINT:~/.ssh$ ls -la
合計 12
drwx------  2 hosopro hosopro 4096  5月  2 18:58 .
drwxr-xr-x 23 hosopro hosopro 4096  5月  2 18:51 ..
-rw-------  1 hosopro hosopro  402  5月  2 18:45 authorized_keys

ここまで出来たら一旦ログアウトします。
hosopro@MOUSEMINT:~/.ssh$ logout
Connection to 192.168.1.20 closed.


再度SSH接続してみます。
PS C:\Users\hosopro\.ssh> ssh hosopro@192.168.1.20
Enter passphrase for key 'C:\Users\hosopro/.ssh/id_rsa':←秘密鍵のパスフレーズを入力
Last login: Sun May  2 18:47:14 2021 from 192.168.1.10
今度はパスワードでなくパスフレーズを聞いてきました。
うまくいってるようです。
鍵を生成するときに設定したパスフレーズを入力してログインします。
これで公開鍵認証でSSH接続できるようになりました。


公開鍵認証での接続が可能になったので、これまで使用してたパスワード認証は禁止にしたいと思います。

/etc/ssh/sshd_configをviなどで開きます。
PasswordAuthenticationを探し、設定がデフォルトで「yes」になっているのでコメントを外して「no」に書き換えます。
#PasswordAuthentication yes

PasswordAuthentication no

書き換えたら保存し、sshdを再起動します。
$ sudo /etc/init.d/ssh restart

これで鍵を持ってないと弾かれるようになります。
PS C:\> ssh hosopro@mousemint
hosopro@mousemint: Permission denied (publickey).


WindowsからSSH接続するとなると昔はTeraTermやPuTTYを使うのが定番でしたが、デフォルトでPowerShellから接続が出来るのはありがたいですね。これから使っていきたいと思います。



2021年4月29日

【PowerShell】WORDのdocファイルをdocxに変換するスクリプト


最近仕事で、昔作られたWordの仕様書を見る機会があったのですが、ファイル形式が古くて「doc」形式だったんです。 docでも見るぶんにはなんら問題はないのですが、今後のことを考えて一つ一つ開いて「docx」形式で保存するということやっていたんです。

しかし、ファイル数が多いんです。100近くもあるんです。

それでまた思ったんですよ、「めんどくせぇー!」って。笑

というわけで「doc」形式のファイルを「docx」形式に変換するスクリプトを作りました。
###############################################################################
# docファイルをdocxに変換するスクリプト
###############################################################################

$targetPath = "C:\work"

#docファイルを取得
$files = Get-ChildItem -Path $targetPath | ? { $_.Extension -like "*.doc" }

#文書の保存形式(DOCX形式)
$wdFormatDocumentDefault = 16

foreach ($f in $files)
{
    Write-Host $f
    
    #Wordオブジェクトを生成
    $word = New-Object -ComObject Word.Application

    #ファイルをオープン
    $doc = $word.Documents.Open($f.FullName)
    
    #保存ファイル名(拡張子を変更)
    $outputfile = $f.FullName.Replace("doc", "docx")
    Write-Host $outputfile
    
    #保存
    $doc.SaveAs2([ref]$outputfile, [ref]$wdFormatDocumentDefault)
    
    #閉じる
    $doc.Close()
    
    #終了
    $word.Quit()
}

Write-Host "処理が完了しました。"
少し解説すると、最初の$targetPathはターゲットとなるフォルダを指定します。このフォルダ内にあるdocファイルを全て取得して順番に一つ一つ変換していきます。

やってることは単純なのでコードを見ていただければ分かると思いますが、ポイントは保存ファイル名と保存時のSaveAs2のパラメータです。

最初、保存ファイル名はただの文字列で指定していたのですが、保存時にエラーになってしまいうまくいかなかったのでこのようなやり方になりました。おそらくオブジェクト型でないとダメなのだと思います。

次にSaveAs2のパラメータですが、こちらは頭に[ref]を付ける必要があります。最初これに気付かずに非常に苦労しました。 なぜ参照渡しにしなければいけないのかよく分かりませんが、メソッドがそのように定義されているからなんでしょう。

<参考>
http://mtgpowershell.blogspot.com/2010/10/wordhtml.html
https://docs.microsoft.com/ja-jp/office/vba/api/word.wdsaveformat


2021年4月18日

【PowerShell】複数のWordファイルの文字列を一括置換するスクリプト


最近、仕事で複数のWordファイルを編集する作業がありまして、ある文字列を別の文字列に置換するというものだったのですが、ファイル数が結構あり、こういうのって自動でやらせたいなと思ってスクリプトを作ってみました。

ネットで探すとVBAを使ったやり方は結構たくさん見つかるんですが、PowerShellを使ったやり方はなかなか見つからないんですよね。
それで作るのに苦労したのですが、VBAのやり方を参考にいろいろ試しながらなんとか出来上がりました。
###############################################################################
# 複数のWordファイルの文字列を一括置換するスクリプト
###############################################################################

#Wordファイルが格納されているフォルダ
$targetPath = "C:\work"

#WdFindWrap定数
$wdFindContinue = 1 #検索範囲の先頭または末尾まで検索しさらに検索を続ける

#WdReplace定数 
$wdReplaceAll = 2 #すべて置換する

#パラメーター
$findText = "東京都"        #検索する文字列
$matchCase = $false         #大文字小文字の区別する
$matchWholeWord = $true     #完全に一致する単語だけを検索する
$matchWildcards = $false    #ワイルドカードを使用する
$matchSoundsLike = $false   #あいまい検索
$matchAllWordForms = $false #すべての単語の活用形を検索する
$forward = $true            #検索方向(Trueで末尾へ)
$wrap = $wdFindContinue     #検索が文書の末尾に達した場合にどうするか(WdFindWrap定数)
$format = $false            #書式を検索する場合
$replaceWith = "神奈川県"   #置換文字列
$replace = $wdReplaceAll    #置換する文字列の個数(Wdreplace 定数)
$matchKashida = $false      #アラビア語のドキュメントでの kashida のテキストを区別
$matchdiacritics = $false   #右から左への言語の文書内には、発音区別符号が一致するテキストを区別
$matchalefhamza = $false    #アラビア語ドキュメント内の alef hamza が一致するテキストを区別
$matchControl = $false      #右から左への言語の文書で双方向制御文字が一致するテキストを区別

#Wordファイルを取得
$files = Get-ChildItem -Path $targetPath -Filter *.docx 

foreach ($f in $files)
{
    Write-Host $f

    $word = New-Object -ComObject Word.Application
    $word.Visible = $false
    
    $doc = $word.Documents.Open($f.FullName)

    #置換
    $word.Selection.Find.Execute($findText, `
                                 $matchCase, `
                                 $matchWholeWord, `
                                 $matchWildcards, `
                                 $matchSoundsLike, `
                                 $matchAllWordForms, `
                                 $forward, `
                                 $wrap, `
                                 $format, `
                                 $replaceWith, `
                                 $replace, `
                                 $matchKashida, `
                                 $matchdiacritics, `
                                 $matchalefhamza, `
                                 $matchControl) 

    #保存
    $doc.Save()

    #閉じる
    $doc.Close()

    #終了
    $word.Quit()
}

少し解説すると、$targetPathはWordファイルが格納されているフォルダです。このフォルダ内にある全てのWordファイルの文字列を置換します。

次にFind.Executeメソッドで指定するパラメーターを設定しています。通常、VBAで実行するときは必要なパラメーターだけ指定すればいいのですが、PowerShellの場合すべて指定しないといけません。最初このパラメーターの指定方法がよく分からなくて苦労しました。

$findTextに検索する文字列、$replaceWithに置換後の文字列を指定します。この例では、「東京都」を「神奈川県」に置換しています。
$wdFindContinueはWdFindWrap定数を指定します。今回はwdFindContinue(値:1)を指定して末尾まで検索してもさらに検索するようにしています。
$replaceはWdReplace定数を指定します。今回はwdReplaceAll(値:2)を指定して全て置換するようにしています。

あとは、foreachで見つかったWordファイルに対して同じ処理をくり返しています。


<参考>
http://mtgpowershell.blogspot.com/2010/11/word_12.html
https://touch-sp.hatenablog.com/entry/2017/04/11/185127
https://tonari-it.com/word-vba-replace-replacement/
Find.Execute メソッド | Microsoftドキュメント
WdFindWrap 列挙型 | Microsoftドキュメント
WdFindWrap 列挙型 | Microsoftドキュメント


2019年3月25日

【PowerShell】日付を和暦表示するスクリプト


新元号発表まであと1週間となりましたが、PowerShellで日付を和暦表示するスクリプトを作ってみました。

#
# Get-WarekiDate.ps1
#

#パラメータ
Param($date, $time)

try{
    if (($date -eq $null) -And ($time -eq $null)){
        #両方nullなら現在の日付を取得
        $d = Get-Date
    } elseif (($date -ne $null) -And ($time -eq $null)) {
        #指定した日付
        $d = [System.DateTime]::Parse($date)
    } elseif (($date -ne $null) -And ($time -ne $null)) {
        #指定した日付と時刻
        $d = [System.DateTime]::Parse($date + ' ' + $time)
    } else {
        #それ以外はエラー
        Write-Output 'パラメータが間違っています。[日付] [時刻]を指定してください。'
        exit
    }

    $c = New-Object System.Globalization.CultureInfo("ja-JP", $true)
    $c.DateTimeFormat.Calendar = New-Object System.Globalization.JapaneseCalendar

    #和暦で表示
    $d.ToString("ggy年M月d日 HH:mm:ss", $c)
}
catch [System.FormatException]{
    Write-Host "日付の指定が間違っています。"
    Write-Host $_
}
catch{
    Write-Host $_
}
少し解説すると、まず、下準備としてCultureInfoクラスで"ja-JP"のインスタンスを作成し、カレンダーを和暦(JapaneseCalendarクラス)に置き換えます。そして、DateTimeオブジェクトのToStringで、第2引数にCultureInfoクラスのインスタンスを指定すれば和暦として表示されます。

Windowsでは和暦情報を下記のレジストリを使って管理しているのですが、PowerShellで和暦表示させる場合もこの情報を取得してきています。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\Calendars\Japanese\Eras
PS C:\work\PowerShell> Get-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Control\Nls\Calendars\Japanese\Eras


1868 01 01   : 明治_明_Meiji_M
1912 07 30   : 大正_大_Taisho_T
1926 12 25   : 昭和_昭_Showa_S
1989 01 08   : 平成_平_Heisei_H
PSPath       : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\Calendars\Japanese\Eras
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\Calendars\Japanese
PSChildName  : Eras
PSDrive      : HKLM
PSProvider   : Microsoft.PowerShell.Core\Registry
ここには元号が始まった日と表記方法が格納されています。
おそらく4月1日以降マイクロソフトから更新プログラムが公開され、平成の下に新元号のデータが追加されることになると思います。


では、実際に表示させてみます。

PS C:\work\PowerShell> .\Get-WarekiDate.ps1
平成31年3月25日 21:54:10
パラメータに何も指定しない場合は、現在の日時が和暦表示されます。

PS C:\work\PowerShell> .\Get-WarekiDate.ps1 1980/3/25
昭和55年3月25日 00:00:00
パラメータに日付を指定すると、指定した日付が和暦表示されます。

PS C:\work\PowerShell> .\Get-WarekiDate.ps1 1912/7/30 22:32
大正1年7月30日 22:32:00
パラメータに日付と時刻を指定すると、指定した日時が和暦表示されます。


4月1日、どんな元号となるのか楽しみです。


<参考>
西暦と和暦を変換するには?:.NET TIPS - @IT
アプリケーションの新元号対応 | Microsoft Docs
DateTime.ToString Method (System) | Microsoft Docs
CultureInfo Class (System.Globalization) | Microsoft Docs
JapaneseCalendar Class (System.Globalization) | Microsoft Docs


2018年8月13日

【PowerShell】画像に半透明の透かし文字を入れるスクリプト


前回、『画像に透かしを入れるスクリプト』という記事で画像に文字を入れるスクリプトを紹介しましたが、あれでは本当の意味での透かしになっていませんでした。

やはり、透かしと言うぐらいなので文字が透けてなければいけません。

そこでいろいろ調べ結果、文字を半透明にして入れる方法が分かりましたので今回は画像に半透明の透かし文字を入れるスクリプトです。

#Create-Watermark2

#画像ファイルを読み込んでImageオブジェクトを作成する
$img = New-Object System.Drawing.Bitmap("C:\work\watermark\before2.jpg")

#ImageオブジェクトのGraphicsオブジェクトを作成する
$g = [System.Drawing.Graphics]::FromImage($img)

#半透明のブラシを作成する
$b = New-Object System.Drawing.SolidBrush([System.Drawing.Color]::FromArgb(96, [System.Drawing.Color]::Black))
$fnt = New-Object System.Drawing.Font("メイリオ", 16)

#文字列を右下に描画する
$g.DrawString("©ほそぼそプログラミング日記", $fnt, $b, 180, 530)
$fnt.Dispose()
$b.Dispose()

#作成した画像を保存する
$img.Save("C:\work\watermark\after2.jpg")

#リソースを解放する
$g.Dispose()
$img.Dispose()

少し解説すると、Color.FromArgb メソッドにアルファ値(1~254)を指定すると文字を半透明にすることが出来ます。今回は、色を「黒」にしてアルファ値を「96」にしています。


実行結果

ビフォア




アフター

おわかりいただけただろうか笑

文字色を黒にしているのですが、半透明にしていることによって薄っすらと文字が入っています。


<参考サイト>
半透明の線や文字を描画する | dobon.net
Graphics.DrawString メソッド (String, Font, Brush, Single, Single) | MSDN
Color.FromArgb メソッド (Int32, Color) | MSDN
SolidBrush クラス | MSDN


<関連記事>
【PowerShell】画像に透かしを入れるスクリプト
キュレーションサイトに勝手に画像を直リンされたので削除してやったよ。


2018年7月29日

【PowerShell】画像に透かしを入れるスクリプト


こういうブログとかに画像を掲載していると、その画像を盗用される心配があります。

簡単に出来る対策として、画像に著作権表示を入れるというものがあります。

そこで今回は、画像に透かしを入れるスクリプトを試しに作ってみました。
#Create-Watermark

Add-Type -AssemblyName System.Drawing

#画像ファイルを読み込んでImageオブジェクトを作成する
$img = New-Object System.Drawing.Bitmap("C:\work\watermark\before.jpg")

#ImageオブジェクトのGraphicsオブジェクトを作成する
$g = [System.Drawing.Graphics]::FromImage($img)

#文字列を右下に描画する
$fnt = New-Object System.Drawing.Font("メイリオ", 10)
$width = $img.Width
$height = $img.Height
$g.DrawString("©ほそぼそプログラミング日記", $fnt, [System.Drawing.Brushes]::Black, $width - 400, $height - 50)
$fnt.Dispose();

#作成した画像を保存
$img.Save("C:\work\watermark\after.jpg")

#リソースを解放
$g.Dispose()
$img.Dispose()


実行結果

元の画像




透かしを入れた画像


ほんとに単純に文字列を追加しただけで、文字自体も半透明とかにはなってないのですが、画像処理ソフトなどを使わずに著作権表示を簡単に入れられるのはなかなか便利なのではないかと思います。

あと、文字を入れる位置は実際に試してみて調整を加えて上記のような設定にしています。元の画像の大きさによって位置が結構違ってくるので、もしかしたらもっと違う指定の仕方があるのかもしれません。そこはまた今後の課題ということで分かったらまたお伝えしたいと思います。


<参考サイト>
プログラムで画像を動的に作成する | dobon.net


<関連記事>
【PowerShell】画像に半透明の透かし文字を入れるスクリプト


2017年12月28日

【PowerShell】SendToフォルダを表示するスクリプト2


すみません、昨日の記事『SendToフォルダを表示するスクリプト』、ぜんぜんダメでした。

もっといいやり方があります。

.Net Frameworkで特殊フォルダを取得できました。

以前、自分で記事を書いておきながらすっかり忘れていたのですが、SendToも特殊フォルダとして取得できました。

ですので最適な方法はこれです。
[Environment]::GetFolderPath('SendTo') | Invoke-Item






2017年12月27日

【PowerShell】SendToフォルダを表示するスクリプト


たまにコンテキストメニューの「送る」にショートカットを追加したくなったりすることがあるのですが、あの「SendTo」フォルダってどこだったっけ?といつも分からなくなります。

そこでSendToフォルダを表示するスクリプトを作ってみました。

#ユーザー名取得
$user = $env:username

#SendToフォルダパス
$folder = 'C:\Users\' + $user + '\AppData\Roaming\Microsoft\Windows\SendTo'

#フォルダを開く
Invoke-Item $folder
SendToフォルダは、「ユーザー」→「(ユーザー名)」→「AppData」→「Roaming」→「Microsoft」→「Windows」→「SendTo」と進んでいくとあります。

単純に$env:usernameでユーザー名を取得して「SendTo」までのパスを作成しました。


実行結果







2017年12月26日

【PowerShell】天気予報を取得してWindowsフォームに表示する


以前書いた、『Invoke-RestMethodを使って天気予報を取得してみる』の方法で取得した天気情報をWindowsフォームに表示するようにしてみました。

とりあえず明日の天気だけ表示するようにしています。今日とか明後日も表示させようか思いましたがラベルとか配置させるのが面倒なのでやめました。(笑)

#天気情報取得
$city = 140020
$tenki = Invoke-RestMethod http://weather.livedoor.com/forecast/webservice/json/v1?city=$city

Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
 
#フォーム
$form = New-Object System.Windows.Forms.Form 
$form.Text = "天気予報"
$form.Size = New-Object System.Drawing.Size(200,180) 
$form.StartPosition = "CenterScreen"
$form.BackColor = [System.Drawing.Color]::White
$form.MaximizeBox = $false
$form.MinimizeBox = $false
$form.FormBorderStyle = [System.Windows.Forms.FormBorderStyle]::FixedSingle

#タイトル
$title = New-Object System.Windows.Forms.Label
$title.Location = New-Object System.Drawing.Point(20, 20) 
$title.Size = New-Object System.Drawing.Size(200,20) 
$title.Text = $tenki.title
$title.Font = New-Object System.Drawing.Font($title.Font, [System.Drawing.FontStyle]::Bold)
$form.Controls.Add($title) 

#ラベル1
$label1 = New-Object System.Windows.Forms.Label
$label1.Location = New-Object System.Drawing.Point(30, 50) 
$label1.Size = New-Object System.Drawing.Size(200,20) 
$label1.Text = $tenki.forecasts[1].dateLabel + '  ' + ([DateTime]::Parse($tenki.forecasts[1].date)).ToString("yyyy年MM年dd日")
$form.Controls.Add($label1) 

#PictureBox
$pic = New-Object System.Windows.Forms.PictureBox
$pic.ImageLocation = $tenki.forecasts[1].image.url
$pic.Location = New-Object System.Drawing.Point(30, 80) 
$pic.Size = New-Object System.Drawing.Size(50, 31)
$pic.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::Zoom
$form.Controls.Add($pic) 

#予報
$telop = New-Object System.Windows.Forms.Label
$telop.Location = New-Object System.Drawing.Point(90, 80) 
$telop.Size = New-Object System.Drawing.Size(70,20) 
$telop.Text = $tenki.forecasts[1].telop
$form.Controls.Add($telop) 

#最高気温
$tempmax = New-Object System.Windows.Forms.Label
$tempmax.Location = New-Object System.Drawing.Point(90, 100) 
$tempmax.Size = New-Object System.Drawing.Size(30,20) 
$tempmax.Text = $tenki.forecasts[1].temperature.max.celsius
$tempmax.ForeColor = [System.Drawing.Color]::Red
$form.Controls.Add($tempmax) 

#最低気温
$tempmin = New-Object System.Windows.Forms.Label
$tempmin.Location = New-Object System.Drawing.Point(120, 100) 
$tempmin.Size = New-Object System.Drawing.Size(30,20) 
$tempmin.Text = $tenki.forecasts[1].temperature.min.celsius
$tempmin.ForeColor = [System.Drawing.Color]::Blue
$form.Controls.Add($tempmin) 

#フォームを表示
$result = $form.ShowDialog()

#リソースを開放
$pic.Image.Dispose()
$pic.Image = $null

実行結果







2017年12月25日

【PowerShell】Windowsフォームに画像を表示する


Windowsフォームに画像を表示できるか試してみました。

今回、試しにこの画像を表示させてみたいと思います。

動物のアイコン | かわいいフリー素材集 いらすとや

Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

#フォーム
$form = New-Object System.Windows.Forms.Form 
$form.Text = "イメージテスト"
$form.Size = New-Object System.Drawing.Size(300,200) 
$form.StartPosition = "CenterScreen"

#PictureBox
$pic = New-Object System.Windows.Forms.PictureBox
$pic.Size = New-Object System.Drawing.Size(100, 100)
$pic.Image = [System.Drawing.Image]::FromFile("C:\work\pic\animal_buta.png")
$pic.Location = New-Object System.Drawing.Point(20,20) 
$pic.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::Zoom
$form.Controls.Add($pic) 

#フォームを表示
$result = $form.ShowDialog()

#リソースを開放
$pic.Image.Dispose()
$pic.Image = $null

実行結果



<参考サイト>
PictureBoxコントロールに簡単に画像を表示する: .NET Tips: C#, VB.NET






2017年12月24日

【PowerShell】クリスマスツリーを作ってみた


今日は12月24日、クリスマスイブということでスクリプトでクリスマスツリーを作ってみました。

################################################################################
# ChristmasTree.ps1
################################################################################
for($i = 0; $i -lt 10; $i++)
{
    cls
    Write-Host "   Merry Christmas   " -ForegroundColor Red -BackgroundColor Green
    Write-Host ""

    $mod = $i % 2

    if ($mod -eq 0)
    {
        Write-Host "          ☆" -ForegroundColor Yellow
        Write-Host ""
        Write-Host "        *" -NoNewline -ForegroundColor Red
        Write-Host "   *" -ForegroundColor Green
        Write-Host ""
        Write-Host "      *" -NoNewline -ForegroundColor Red
        Write-Host "   *" -NoNewline -ForegroundColor Green
        Write-Host "   *" -ForegroundColor Yellow
        Write-Host ""
        Write-Host "    *" -NoNewline -ForegroundColor Yellow
        Write-Host "   *" -NoNewline -ForegroundColor Red
        Write-Host "   *" -NoNewline -ForegroundColor Green
        Write-Host "   *" -ForegroundColor Red
        Write-Host ""
        Write-Host "  *" -NoNewline -ForegroundColor Green
        Write-Host "   *" -NoNewline -ForegroundColor Red
        Write-Host "   *" -NoNewline -ForegroundColor Green
        Write-Host "   *" -NoNewline -ForegroundColor Red
        Write-Host "   *" -ForegroundColor Yellow
        Write-Host "          ||" -ForegroundColor DarkRed
        Write-Host "          ||" -ForegroundColor DarkRed
        Write-Host ""
    }
    else
    {
        Write-Host "          ☆" -ForegroundColor Yellow
        Write-Host ""
        Write-Host "        *" -NoNewline -ForegroundColor Green
        Write-Host "   *" -ForegroundColor Yellow
        Write-Host ""
        Write-Host "      *" -NoNewline -ForegroundColor Yellow
        Write-Host "   *" -NoNewline -ForegroundColor Red
        Write-Host "   *" -ForegroundColor Green
        Write-Host ""
        Write-Host "    *" -NoNewline -ForegroundColor Red
        Write-Host "   *" -NoNewline -ForegroundColor Green
        Write-Host "   *" -NoNewline -ForegroundColor Yellow
        Write-Host "   *" -ForegroundColor Green
        Write-Host ""
        Write-Host "  *" -NoNewline -ForegroundColor Yellow
        Write-Host "   *" -NoNewline -ForegroundColor Green
        Write-Host "   *" -NoNewline -ForegroundColor Yellow
        Write-Host "   *" -NoNewline -ForegroundColor Green
        Write-Host "   *" -ForegroundColor Red
        Write-Host "          ||" -ForegroundColor DarkRed
        Write-Host "          ||" -ForegroundColor DarkRed
        Write-Host ""
    }

    Start-Sleep -m 1000
}
なんかものずごい力技!(汗)


実行結果


それではよいクリスマスを。






2017年12月16日

【PowerShell】コピーしたソースコードに含まれる0xC2A0(no-break space)を半角スペース(0x20)に変換するスクリプトを作ってみた


当ブログの記事中に掲載しているソースコードをコピーしてVBEなどのエディターに貼り付けると、行頭の空白が変な文字に変換されててそのままでは使えないことがあります。

たとえば、このようなソースコードをコピーして、
Public Sub MakeForm()

    CreateForm
    
    DoCmd.Restore
    
End Sub

AccessのVBEに貼り付けてみると、

頭に「?」が並んだ状態になってしまいます。

これでは当然コンパイルできませんし、実行も出来ません。

調べてみると、どうやらこれはno-break spaceというものでWeb上で複数の空白を表現するのに使われたりするらしいんです。そしてUTF-8だと0xC2A0のコードになるようなんです。

あと気になるのは、この現象が起きるのはChromeだけなんですよね。
FirefoxやEdgeだと起きません。

なんなんですかね。

Javascriptの解釈の仕方が違うんですかね。

まあでも、このブログのアクセスの6割ぐらいがChromeからで無視するわけにはいかないんで、この0xC2A0を0x20に変換するスクリプトを作ってみました。

################################################################################
# Convert-C2A0.ps1
# 
# 0xC2A0を0x20に変換する
#
################################################################################

#コードを変換
function ConvertStr{
    param($code)

    [Byte[]]$data = [System.Text.Encoding]::UTF8.GetBytes($code)

    [byte[]]$b = @()

    [bool]$flag = $false

    for ($i=0; $i -lt $data.Count; $i++)
    {
        if ($data[$i].ToString("X2") -eq "C2")
        {
            $preIndex = $i
            $flag = $true
        }
        elseif (($flag -eq $true) -and ($data[$i].ToString("X2") -eq "A0"))
        {
            $b += 0x20
            $flag = $false
        }
        elseif (($flag -eq $true) -and ($data[$i].ToString("X2") -ne "A0"))
        {
            $b += $data[$preIndex]
            $b += $data[$i]
            $flag = $false
        }
        else
        {
            $b += $data[$i]
        }
    }

    $str = [System.Text.Encoding]::UTF8.GetString($b)

    return($str)
}


Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

#フォーム
$form = New-Object System.Windows.Forms.Form 
$form.Text = "Convert C2A0"
$form.Size = New-Object System.Drawing.Size(400,240) 
$form.StartPosition = "CenterScreen"

#ラベル
$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(20,15) 
$label.Size = New-Object System.Drawing.Size(250,20) 
$label.Text = "コードを貼り付けて変換ボタンを押してください。"
$form.Controls.Add($label) 

#テキストボックス
$textBox = New-Object System.Windows.Forms.TextBox 
$textBox.Location = New-Object System.Drawing.Point(20,40) 
$textBox.Multiline = $True
$textBox.AcceptsReturn = $True
$textBox.AcceptsTab = $True
$textBox.WordWrap = $True
$textBox.ScrollBars = [System.Windows.Forms.ScrollBars]::Vertical
$textBox.Anchor = (([System.Windows.Forms.AnchorStyles]::Left) `
              -bor ([System.Windows.Forms.AnchorStyles]::Top) `
              -bor ([System.Windows.Forms.AnchorStyles]::Right) `
              -bor ([System.Windows.Forms.AnchorStyles]::Bottom))
$textBox.Size = New-Object System.Drawing.Size(340,110) 
$textBox.Add_KeyDown({if ($_.Control -and ($_.KeyCode -eq [System.windows.forms.Keys]::A)) 
    {$textBox.SelectAll()}})
$form.Controls.Add($textBox) 

#変換ボタン
$ConvertButton = New-Object System.Windows.Forms.Button
$ConvertButton.Location = New-Object System.Drawing.Point(270,10)
$ConvertButton.Size = New-Object System.Drawing.Size(75,23)
$ConvertButton.Text = "変換"
$ConvertButton.Anchor = (([System.Windows.Forms.AnchorStyles]::Left) `
                    -bor ([System.Windows.Forms.AnchorStyles]::Top))
$ConvertButton.Add_Click({$textBox.Text=ConvertStr $textBox.Text; `
                          [System.Windows.Forms.MessageBox]::Show("変換が完了しました。")})
$form.Controls.Add($ConvertButton)

#閉じるボタン
$ExitButton = New-Object System.Windows.Forms.Button
$ExitButton.Location = New-Object System.Drawing.Point(285,160)
$ExitButton.Size = New-Object System.Drawing.Size(75,23)
$ExitButton.Text = "閉じる"
$ExitButton.Anchor = (([System.Windows.Forms.AnchorStyles]::Right) `
                   -bor ([System.Windows.Forms.AnchorStyles]::Bottom))
$ExitButton.Add_Click({$form.Close()})
$form.Controls.Add($ExitButton)

#フォームを常に手前に表示
$form.Topmost = $True

#フォームをアクティブにし、テキストボックスにフォーカスを設定
$form.Add_Shown({$textBox.Select()})

#フォームを表示
$result = $form.ShowDialog()
少し解説すると、テキストボックスに貼り付けられた文字列を、まずUTF-8としてバイト型配列に変換します。次に、バイト型配列を1バイトずつチェックしていき、"0xC2" "0xA0"と並んで来た場合に"0x20"に置き換えるようにしています。あとは、返還後の文字列をテキストボックスに書き込んでいます。

使用法

まず、上記スクリプトを名前を付けてファイルに保存し、PowerShellのプロンプトで実行してください。


スクリプトを実行すると、このような画面が表示されます。



画面が表示されたらテキストボックスにソースコードを貼り付け、[変換]ボタンをクリックします。



変換が終わるとこのようなメッセージが表示されます。

変換後の文字列が同じテキストボックスに表示されますので、このテキストボックスのソースコードをコピーして使ってください。






2017年11月29日

【PowerShell】Wordに貼り付けた画像を変更する


Wordに貼り付けた画像を変更するスクリプトを作ってみました。


たとえば、このような「猫」の画像を変更して「クラゲ」の画像にしてみたいと思います。

$word = New-Object -ComObject "Word.Application"
$word.Visible = $true
$word.Documents.Open("C:\work\word\test02.docx")

#位置やサイズを記憶
$left = $word.ActiveDocument.Shapes(1).Left
$top = $word.ActiveDocument.Shapes(1).Top
$width = $word.ActiveDocument.Shapes(1).Width
$height = $word.ActiveDocument.Shapes(1).Height

#一度削除する
$word.ActiveDocument.Shapes(1).Delete

#再度画像を貼り付け
$word.ActiveDocument.Shapes.AddPicture("C:\work\word\kurage.jpg", $false, $true, $left, $top, $width, $height)
ポイントは、一度画像を削除してから、再度画像を貼り付けてるところです。どうやら既存のオブジェクトの画像を変更することは出来ないようです。

実行結果







2017年11月25日

【PowerShell】ファイルを読み込み16進数でバイナリ表示する


ファイルを読み込みこんで、16進数でバイナリ表示するスクリプトを作ってみました。




ためしに、今回このようなテキストファイルを変換してみます。

$file = "C:\work\test.txt"

[Byte[]]$data = Get-Content $file -Encoding Byte

$buf = ''
$cnt = 0

Write-Host

foreach($a in $data)
{
    $buf = $buf + ' ' + $a.ToString("X2")     
    $cnt += 1
    if ($cnt -eq 16)
    {
        Write-Host $buf
        $buf = ''
        $cnt = 0 
    }
}

Write-Host $buf
まず、Get-Contentを使ってファイルをバイト配列に格納します。そして、あとは順番に読み込み16進数表記で出力しています。また、プロンプトへの表示はバイナリエディタぽく16バイトずつ表示するようにしました。


実行結果







2017年11月22日

【PowerShell】対象のフォルダ内のファイルを一括で読み取り専用にする


対象のフォルダ内のファイルを一括で読み取り専用にする方法です。

たとえば、フォルダにこのように複数のファイルがあるとします。
PS C:\work\test> Get-ChildItem


    ディレクトリ: C:\work\test


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2017/10/04     21:04           5544 error001.txt
-a----       2017/10/04     21:05           7392 error002.txt
-a----       2017/10/04     21:05           1848 error003.txt
-a----       2017/10/04     21:05           3696 error004.txt
-a----       2017/10/04     21:05          11088 error005.txt
-a----       2017/10/04     21:05          11088 error006.txt
-a----       2017/10/04     21:06           5544 error007.txt
-a----       2017/10/04     21:06           3696 error008.txt
-a----       2017/10/04     21:06          14784 error009.txt
-a----       2017/10/04     21:06           9240 error010.txt


このフォルダ内のファイルを一括で読み取り専用にするには次のように実行します。
PS C:\work\test> Get-ChildItem -Recurse | %{Set-ItemProperty $_.fullname -Name Attributes  -Value "Readonly"}


もう一度Get-ChildItemで確認してみると、
PS C:\work\test> Get-ChildItem


    ディレクトリ: C:\work\test


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
--r---       2017/10/04     21:04           5544 error001.txt
--r---       2017/10/04     21:05           7392 error002.txt
--r---       2017/10/04     21:05           1848 error003.txt
--r---       2017/10/04     21:05           3696 error004.txt
--r---       2017/10/04     21:05          11088 error005.txt
--r---       2017/10/04     21:05          11088 error006.txt
--r---       2017/10/04     21:06           5544 error007.txt
--r---       2017/10/04     21:06           3696 error008.txt
--r---       2017/10/04     21:06          14784 error009.txt
--r---       2017/10/04     21:06           9240 error010.txt
読み取り専用に変更されました。






2017年11月19日

【PowerShell】Windowsフォームにテキストボックスを表示して入力できるようにする


前回、『Windowsフォームを作成する』でWindowsフォームの表示をしてみましたが、今回は、Windowsフォームにテキストボックスを表示して入力できるようにしてみました。

まあ、マイクロソフトの下記のサイトのコードをほぼパクッてるんですが、テキストボックスをマルチラインにしたり若干アレンジを加えてますのでよかったら参考にしてみてください。
https://docs.microsoft.com/ja-jp/powershell/scripting/getting-started/cookbooks/creating-a-custom-input-box?view=powershell-5.1

Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

#フォーム
$form = New-Object System.Windows.Forms.Form 
$form.Text = "入力フォーム作成テスト"
$form.Size = New-Object System.Drawing.Size(400,240) 
$form.StartPosition = "CenterScreen"

#ラベル
$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(20,20) 
$label.Size = New-Object System.Drawing.Size(340,20) 
$label.Text = "何か入力してください"
$form.Controls.Add($label) 

#テキストボックス
$textBox = New-Object System.Windows.Forms.TextBox 
$textBox.Location = New-Object System.Drawing.Point(20,40) 
$textBox.Multiline = $True
$textBox.AcceptsReturn = $True
$textBox.AcceptsTab = $True
$textBox.WordWrap = $True
$textBox.ScrollBars = [System.Windows.Forms.ScrollBars]::Vertical
$textBox.Anchor = (([System.Windows.Forms.AnchorStyles]::Left) `
              -bor ([System.Windows.Forms.AnchorStyles]::Top) `
              -bor ([System.Windows.Forms.AnchorStyles]::Right) `
              -bor ([System.Windows.Forms.AnchorStyles]::Bottom))
$textBox.Size = New-Object System.Drawing.Size(340,100) 
$form.Controls.Add($textBox) 

#OKボタン
$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Point(200,160)
$OKButton.Size = New-Object System.Drawing.Size(75,23)
$OKButton.Text = "OK"
$OKButton.Anchor = (([System.Windows.Forms.AnchorStyles]::Right) `
               -bor ([System.Windows.Forms.AnchorStyles]::Bottom))
$OKButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
$form.AcceptButton = $OKButton
$form.Controls.Add($OKButton)

#キャンセルボタン
$CancelButton = New-Object System.Windows.Forms.Button
$CancelButton.Location = New-Object System.Drawing.Point(285,160)
$CancelButton.Size = New-Object System.Drawing.Size(75,23)
$CancelButton.Text = "Cancel"
$CancelButton.Anchor = (([System.Windows.Forms.AnchorStyles]::Right) `
                   -bor ([System.Windows.Forms.AnchorStyles]::Bottom))
$CancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
$form.CancelButton = $CancelButton
$form.Controls.Add($CancelButton)

#フォームを常に手前に表示
$form.Topmost = $True

#フォームをアクティブにし、テキストボックスにフォーカスを設定
$form.Add_Shown({$textBox.Select()})

#フォームを表示
$result = $form.ShowDialog()

if ($result -eq [System.Windows.Forms.DialogResult]::OK)
{
    #OKボタンが押された場合、テキストボックスの内容を取得
    $x = $textBox.Text
    $x
}

実行結果







2017年11月12日

【PowerShell】Windowsフォームを作成する


PowershellでWindowsフォームを作成することが出来るということで試しに作ってみました。

Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

$form = New-Object System.Windows.Forms.Form 
$form.Text = "フォーム作成テスト"
$form.Size = New-Object System.Drawing.Size(400,300) 
$form.StartPosition = "CenterScreen"

$form.ShowDialog()
最初にAdd-Typeで.Netのクラスを読み込んでいます。
あとはFormのオブジェクトを作成し、プロパティを設定します。
そして最後にShowDialog()で表示しています。

実行結果

コントロールが何もないまっさらなフォームです。
しかし結構簡単に作れちゃいました。これなら開発環境が無くてもフォームプログラムが作れますね。






2017年10月28日

【PowerShell】Bloggerのフィード情報を読み込んで最新記事5件分を表示するスクリプト


Bloggerのフィード情報を読み込んで最新記事5件分を表示するスクリプトを作ってみました。

$atom = Invoke-WebRequest https://hosopro.blogspot.com/feeds/posts/default
$xml = [xml]$atom.Content
$ent = $xml.GetElementsByTagName("entry")

for ($i = 0; $i -lt 5; $i++){

    #タイトル
    $ent[$i].Item("title")."#text"

    #投稿日時
    $date = [DateTime]$ent[$i].Item("published")."#text"
    $date.ToString("yyyy/MM/dd HH:mm")
    
    #サマリー
    $ent[$i].Item("summary")."#text".Replace("`n",'').Substring(0, 50).trim() + "..."

    Write-Host
}
フィードの取得にはInvoke-WebRequestを使っています。
サマリーは50文字分表示するようにしてみました。


実行結果
PS C:\work\PowerShell> .\Get-BloggerFeed.ps1
【Access】現在開いている全てのフォームを参照する
2017/10/27 22:13
現在開いている全てのフォームを参照するには、Formsコレクションを使った方法とAllFormsコレ...

【Access】データベース内の全てのフォームを参照する
2017/10/26 21:25
データベース内の全てのフォームを参照するには、AllFormsコレクションを使います。例たとえばこの...

【Access】フォームの背景色を変更する
2017/10/25 21:38
フォームの背景色は、各セクションのBackColorプロパティに値を設定することで変更できます。例た...

【Access】帳票フォームでRequeryを行っても画面がチラつかないようにする
2017/10/24 21:49
前回、「帳票フォームでRequeryを行ってもレコードの表示位置が変わらないようにする」方法を書きま...

【Access】帳票フォームでRequeryを行ってもレコードの表示位置が変わらないようにする
2017/10/23 21:00
帳票フォームでデータの更新などを行ってフォームのRequeryを実行するとレコードの表示が変わってし...






2017年10月22日

【PowerShell】Invoke-RestMethodを使って天気予報を取得してみる


最近、Web APIについてちょっと調べてたのですが、そのなかでお天気情報もWeb APIで取得できることが分かり、ためしにPowerShellで取得してみました。

まず、今回使用するWeb APIですが、livedoorの「お天気Webサービス」を使わせていただきました。
http://weather.livedoor.com/weather_hacks/webservice

こういうお天気のWeb APIって有料のところが多く、なかなか無料で使わせてもらえるところは少ないのですが、livedoorの「お天気Webサービス」は個人利用に限って無料で使うことが出来ます。


それではまず、単純にAPIを叩いてお天気情報を取得してみたいと思います。

使い方は簡単です。
Invoke-RestMethodコマンドレットのあとにAPIのURIを指定するだけです。

レスポンスはJSONで返ってきます。




PS C:\work> Invoke-RestMethod http://weather.livedoor.com/forecast/webservice/json/v1?city=140020


pinpointLocations : {@{link=http://weather.livedoor.com/area/forecast/1415000; name=相模原市}, @{link=http://weather.livedoor.com/area/forecast/1415011; name=相
                    模原市西部}, @{link=http://weather.livedoor.com/area/forecast/1415012; name=相模原市東部}, @{link=http://weather.livedoor.com/area/forecast/
                    1420600; name=小田原市}...}
link              : http://weather.livedoor.com/area/forecast/140020
forecasts         : {@{dateLabel=今日; telop=雨; date=2017-10-22; temperature=; image=}, @{dateLabel=明日; telop=雨のち晴; date=2017-10-23; temperature=; image=
                    }, @{dateLabel=明後日; telop=晴時々曇; date=2017-10-24; temperature=; image=}}
location          : @{city=小田原; area=関東; prefecture=神奈川県}
publicTime        : 2017-10-22T11:00:00+0900
copyright         : @{provider=System.Object[]; link=http://weather.livedoor.com/; title=(C) LINE Corporation; image=}
title             : 神奈川県 小田原 の天気
description       : @{text= 前線が本州の南岸に停滞しています。また、台風第21号が日本の南にあ
                    って北北東に進んでいます。

                     神奈川県は、雨となっています。

                     22日は、前線が本州南岸に停滞するため、雨で夜遅くには雷を伴って非
                    常に激しく降る所があるでしょう。

                     23日は、台風第21号の影響で、雨で朝まで雷を伴い非常に激しい雨が
                    降る所がある見込みです。午後は晴れとなる見込みです。

                     神奈川県の海上では、22日はうねりを伴いしけるでしょう。23日はう
                    ねりを伴い猛烈なしけとなる見込みです。船舶は高波に厳重に警戒してくだ
                    さい。; publicTime=2017-10-22T13:34:00+0900}
単純に実行するとこのような感じになるのですが、オブジェクト変数に格納してそれぞれの内容を個別に取得することも簡単に出来ます。

たとえば変数$tenkiに格納してみます。
PS C:\work> $tenki = Invoke-RestMethod http://weather.livedoor.com/forecast/webservice/json/v1?city=140020

ここで、タイトルを取得するには次のようにアクセスします。
PS C:\work> $tenki.title
神奈川県 小田原 の天気

また、予報を取得するには次のようにアクセスします。
PS C:\work> $tenki.forecasts


dateLabel   : 今日
telop       : 雨
date        : 2017-10-22
temperature : @{min=; max=}
image       : @{width=50; url=http://weather.livedoor.com/img/icon/15.gif; title=雨; height=31}

dateLabel   : 明日
telop       : 雨のち晴
date        : 2017-10-23
temperature : @{min=; max=}
image       : @{width=50; url=http://weather.livedoor.com/img/icon/19.gif; title=雨のち晴; height=31}

dateLabel   : 明後日
telop       : 晴時々曇
date        : 2017-10-24
temperature : @{min=; max=}
image       : @{width=50; url=http://weather.livedoor.com/img/icon/2.gif; title=晴時々曇; height=31}


さらに詳しく取得するには、次のようにアクセスします。

明日の天気
PS C:\work> $tenki.forecasts[1].telop
雨のち晴

明日の最低気温(摂氏)
PS C:\work> $tenki.forecasts[1].temperature.min.celsius
20

明日の最高気温(摂氏)
PS C:\work> $tenki.forecasts[1].temperature.max.celsius
26


非常に簡単にデータを取得できましたので、これを使っていろいろ作れそうな気がしますね。
またこんど作ったときに紹介したいと思います。





<関連記事>
天気予報を取得してWindowsフォームに表示する

2017年10月11日

【PowerShell】MP3ファイルのファイル名をトラック番号付きのファイル名に変更する


MP3ファイルのファイル名をトラック番号付きのファイル名に変更するスクリプトを作ってみました。

Rename-Mp3File.ps1
param($targetDir)

$sh = New-Object -ComObject Shell.Application
$music = $targetDir
$folder = $sh.Namespace($music) 
$items = Get-ChildItem -Path $music -Include *.mp3 -Name
 
foreach($f in $items)
{
    $fi = $folder.ParseName($f)
 
    #トラック番号取得
    $num = $folder.GetDetailsOf($fi,26).PadLeft(2,"0")
    
    $oldFile = Join-Path $music $f
    $newFile = Join-Path $music ($num + ' ' + $f)

    #ファイル名変更
    Rename-Item $oldFile $newFile
}

Get-ChildItem -Path $music

実行例

たとえばこのようなMP3ファイルが入っているフォルダがあるとします。



引数にこのフォルダを指定し、スクリプトを実行します。
PS C:\work\PowerShell> .\Rename-Mp3File.ps1 C:\work\mp3


    ディレクトリ: C:\work\mp3


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2011/04/07     21:32        2215447 01 Black Star.mp3
-a----       2011/04/07     21:33        5350940 02 What The Hell.mp3
-a----       2011/04/07     21:33        5009442 03 Push.mp3
-a----       2011/04/07     21:34        5748950 04 Wish You Were Here.mp3
-a----       2011/04/07     21:35        5255534 05 Smile.mp3
-a----       2011/04/07     21:35        5378378 06 Stop Standing There.mp3
-a----       2011/04/07     21:36        6495746 07 I Love You.mp3
-a----       2011/04/07     21:36        6019979 08 Everybody Hurts.mp3
-a----       2011/04/07     21:37        6512276 09 Not Enough.mp3
-a----       2011/04/07     21:37        5618114 10 4 Real.mp3
-a----       2011/04/07     21:38        5964249 11 Darlin.mp3
-a----       2011/04/07     21:39        7133430 12 Alice (Extended Version).mp3
-a----       2011/04/07     21:39        5588210 13 Remember When.mp3
-a----       2011/04/07     21:40        6297071 14 Goodbye.mp3
-a----       2011/04/07     21:40        5792376 15 What The Hell (Acoustic).mp3
-a----       2011/04/07     21:41        4538096 16 Push (Acoustic).mp3
-a----       2011/04/07     21:41        5675687 17 Wish You Were Here (Acoustic).mp3
-a----       2011/04/07     21:42        3499686 18 Knockin' On Heaven's Door.mp3
-a----       2011/04/07     21:42        4592732 19 Bad Reputation.mp3


ファイル名の先頭にトラック番号が付与されました。