最近のトラックバック

最近のコメント

2017年3月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
無料ブログはココログ

Powershell

2017年1月 9日 (月)

Start-Processの戻り値からProcess IDを取得したい

これもずいぶん初歩的な知識かも。

プロセスの終了を待ってから次のプロセスを起動させる処理を書きたかったのだが、

をざっと(テキトーに)見て、

$proc=Start-Process notepad.exe
Wait-Process $proc.Id

とやっても、上手く動かない(というか、Wait-Processでエラーになる)。
$procにはプロセスのオブジェクトがセットされないのでなぜだろうと、ググると-PassThruパラメータが必要らしい。
元記事を見返すとちゃんと-PassThruパラメータが書かれていた!あぁ情けない。

$proc=Start-Process notepad.exe -PassThru
Wait-Process $proc.Id

これでOK

<参考>

2016年12月10日 (土)

WinPythonのWinPython Powershell Prompt.exeを起動するとエラーがでる

Python.orgからダウンロードしたPythonとは別に、追加でWinPythonをダウンロードしてインストール。

試しにWinPythonに含まれているPowerShell(WinPython Powershell Prompt.exe)を起動してみた。 すると、

"WindowSize" の設定中に例外が発生しました: "ウィンドウの幅は 192 を上回ることができません

というエラーが表示される。
WinPython_PS_Prompt.ps1というスクリプトでエラーが表示されるので中を確認すると、ウィンドウサイズを指定する箇所が問題らしい。
Set-WindowSize 210 40 6000
Set-WindowSize内で
$size = New-Object System.Management.Automation.Host.Size($x,$y)
$host.ui.rawui.WindowSize = $size 
という風に指定している。
なので、210としている箇所を192よりも小さい値に変更。
するとエラーは表示されなくなった。

2011年7月27日 (水)

配列と代入演算子

配列に対して、+演算子は要素の連結を、+=は要素の追加を表す。

PS C:\temp> $aa=@()
PS C:\temp> $aa[0]=0
インデックス '0' が範囲外のため、配列の代入が失敗しました。
発生場所 行:1 文字:5
+ $aa[0 <<<< ]=0
PS C:\temp> $aa+=0
PS C:\temp> $aa[0]
0

2011年5月11日 (水)

呼び出しアプリケーションが終了するまでプロンプトを待たせる方法

Powershellから、例えばnotepadみたいなアプリケーションを起動すると、起動した時点でPowershellのプロンプトが戻ってくる。

notepadが終了するまで次の処理を待たせたい場合は、waitforexit()を使う。

Hey, Scripting Guy! Windows PowerShell を使用してアプリケーションの終了時に通知する方法はありますか

こんな感じ。

PS >notepad

PS >$proc=get-process notepad

PS >$proc.waitforexit()

けど、これはPowershellのV2.0のコマンドなので、V1.0の場合は、

PS >[System.Diagnostics.Process]::Start("notepad").WaitForExit()
PS >Write-Host "Notepad has terminated."

Windows PowerShell スクリプトからアプリケーションを起動した後、アプリケーションが終了するまでスクリプトを一時停止する方法はありますか

コマンドプロンプトからPowershell

こんな感じ。

C:\temp>for /F %i in ( 'powershell -command "$param=\""aaa bbb ccc ddd\"";$param
.replace(\"" \"", \"",\"") " ')  do echo %i

C:\temp>echo aaa,bbb,ccc,ddd
aaa,bbb,ccc,ddd

C:\temp>

加えて、

C:\temp>for /F %i in ("aaa bbb ccc ddd") do echo %i

C:\temp>echo aaa
aaa

C:\temp>

となったので、forループの仕様として、空白で区切られた文字列だと、最初のフィールドの値だけ取ってそれでループは終了となるってことらしい。

コマンドプロンプトからPowershell

おおっ、なるほど。

PowerShell.exe -command "スクリプト" で引用符をエスケープする。

PowerShell.exe -command "スクリプト" で引用符をエスケープする。(その2)

コマンドプロンプトからPowershell1行バッチ

C:\temp>for /F %i in ( 'powershell -command "$param=\""aa bb cc dd\"";$param;"')
do echo %i

C:\temp>echo aa
aa

あれ?なんで?

と思い、試行錯誤の結果、

C:\temp>for /F %i in ( 'powershell -command "$param=\""aa bb cc dd\"";$param.spl
it();"') do echo %i

C:\temp>echo aa
aa

C:\temp>echo bb
bb

C:\temp>echo cc
cc

C:\temp>echo dd
dd

C:\temp>

という風に、望むかたちになった。