投稿

ラベル(PowerShell)が付いた投稿を表示しています

PowerShellスクリプトファイル(ps1)の標準入力へリダイレクトする方法

次のような対話型のPowerShellスクリプトファイルがあったとする。 # hello.ps1 $name = Read-Host your name "Hello $name" | Write-Host Read-Hostで標準入力からユーザの入力を取得している。このスクリプトの呼び出し時に入力を渡して対話を自動化したい。 失敗例 > "Hinata" | .\hello.ps1 your name: スクリプトファイルの呼び出しではパイプラインで文字列を渡しても標準入力にリダイレクトされない。パイプラインの内容は標準入力とは別に$input変数に格納されている。 成功例 > "Hinata" | powershell .\hello.ps1 your name: Hinata Hello Hinata スクリプトの呼び出しではなく、PowerShell実行ファイルにパイプラインで渡して実行させると標準入力にリダイレクトされる。 ただし実行環境が呼び出し元と異なる可能性があることに注意が必要。 > Get-Content .\input.txt | powershell .\hello.ps1 入力元をテキストファイルにする例。改行はEnterキーを押したように処理される。

PowerShellで簡易Webサーバを立てる

PowerShellのバッチでHTTPサーバを立ててみる。今日日開発環境ならば何かしらのデバッグサーバがあるが、それらを用意するほどでもない場合などに用いる。 HTTPサーバを起動する手順 方法としては.NetのSystem.Net.HttpListenerを利用する。 HttpListenerオブジェクトを作成して、任意のポートを開く。 GetContextメソッドでリクエストの受信を待機する。 リクエストの内容に合わせてレスポンスを設定する。 2~3をループで繰り返す。 レスポンスにはファイルを読み込んで返すほか、コマンドを実行した結果を返したりすると簡易リモートサーバ的なこともできる。なおシングルスレッドのためリクエストは一つずつ順番に処理される。 ソースコード 以下はバッチファイルのパスをルートディレクトリとしてファイルデータを返すバッチ。 通信ポートを開くには管理者権限が必要なため、powershellが管理者権限でない場合は管理者に昇格して再起動する処理が最初に入っている。 HttpServer.ps1 $isAdmin = ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) if(-not $isAdmin){ Start-Process powershell -Verb runAs $MyInvocation.MyCommand.Path exit } $myDir=(Split-path $MyInvocation.MyCommand.Path -parent) $root = "$myDir" $port = "60080" function Listen{ try{ $listener = New-Object System.Net.HttpListener $listener.Prefixes.Add("http://*:$port/") $liste...