2014年3月12日水曜日

PowerShellをMicrosoft Updateに対応させ,historyをセッションを超えて保存できるようにする

最近になって、WindowsでPowerShellを使い始めた。
その理由として昔いやになった問題が解決したから

それは
①管理者権限で起動できない
                      su. sudo みたいなことがしたい。
②セッションが終了するとhisotryが消える
                      bashみたいに残せ(+矢印キーが使いたい)
③OSのアップデートなどの機能がない
                      本当は apt や yum みたいなことがしたい
の3個だ。

まず最初の管理者権限で起動だが、これは、以下のようにrunas でadministratorを指定すればOK

PS C:\Users\kouji> runas.exe /env  /user:administrator powershell
administrator のパスワードを入力してください:
powershell をユーザー "KOUJI-PC\administrator" として開始しています...
PS C:\Users\kouji>
環境を引き継ぎたくないなら/env を抜きで
runas.exe   /user:administrator powershell
とする。
これをすると新しいWindowsが立ち上がる。それをやめて同じshellの窓で権限を替えるやりかたは不明
後で知ったが Start-Process powershell.exe -Verb runas のやり方もある。
このほうがすっきりしてていいかも。

つぎにセッションを超えて履歴を残す件
http://orsontyrell.blogspot.jp/2013/11/true-powershell-command-history.html
ここにやり方は書いてある
つまり
https://github.com/psget/psget/
から
PsGet.psm1をダウンロード
(分かりにくいが 右のDownload zipつまり
https://github.com/psget/psget/archive/master.zip
をダウンロードして解凍してPsGet.psm1を得る)
②次にこれをコピーする場所を知る。それは、
PS C:\Users\kouji> $env:PSModulePath
C:\Users\kouji\Documents\WindowsPowerShell\Modules\;C:\windows\system32\WindowsPowerShell\v1.0\Modules\
PS C:\Users\kouji>
のように $env:PSModulePathで分かる
C:\Users\kouji\Documents\WindowsPowerShell\Modules\

C:\windows\system32\WindowsPowerShell\v1.0\Modules\
のどちらでもいいのだが
C:\Users\kouji\Documents\WindowsPowerShell\Modules\
にコピーすることにする。
③コピー
C:\Users\kouji\Documents\WindowsPowerShell\Modules\

\PsGet\を作りPsGet.psm1をコピー
つまり
C:\Users\kouji\Documents\WindowsPowerShell\Modules\PsGet\PsGet.psm1
にコピー
③モジュールを認識させる
PS C:\Users\kouji> Import-Module PsGet
④試しに使う
PS C:\Users\kouji> install-module PsUrl
PS C:\Users\kouji> update-module
Module PsGet was successfully updated.
Module PsUrl was successfully updated.
Module PsUrl was successfully updated.
PS C:\Users\kouji>
⑤モジュール追加
PS C:\Users\kouji> install-module PSReadline
⑥プロファイルの場所を知る
PS C:\Users\kouji> $profile
C:\Users\kouji\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
PS C:\Users\kouji>
⑦書き換え
 もしかするとフォルダがないかもしれない、ない場合はフォルダを作成
 notepad  $profile
 で書き変え(もしくは追加)
 中身はこれ
$MaximumHistoryCount = 31KB
$ImportedHistoryCount = 0
$HistoryDirPath = "c:\script\"
$HistoryFileName = "history.clixml"

if (!(Test-Path $HistoryDirPath -PathType Container))
    {   New-Item $HistoryDirPath -ItemType Directory }

Register-EngineEvent PowerShell.Exiting -Action {          
        $TotalHistoryCount = 0
        Get-History | ? {$TotalHistoryCount++;$true}
        $RecentHistoryCount = $TotalHistoryCount - $ImportedHistoryCount
        $RecentHistory = Get-History -Count $RecentHistoryCount
        if (!(Test-path ($HistoryDirPath + $HistoryFileName)))
        {  
            Get-History | Export-Clixml ($HistoryDirPath + $HistoryFileName)
        }else
        {
            $OldHistory = Import-Clixml ($HistoryDirPath + $HistoryFileName)
            $NewHistory = @($OldHistory + $RecentHistory)
            $NewHistory | Export-Clixml ($HistoryDirPath + $HistoryFileName)
        }
    }

if (Test-path ($HistoryDirPath + $HistoryFileName))
    {  
        Import-Clixml ($HistoryDirPath + $HistoryFileName) | ? {$count++;$true} |Add-History
     Write-Host -Fore Green "`nLoaded $count history item(s).`n"
     $ImportedHistoryCount = $count
    }

# Importing PSReadline must come AFTER you load your command history
if ($host.Name -eq 'ConsoleHost')
    {
        Import-Module PSReadline
    }

# if you don't already have this configured...
Set-PSReadlineKeyHandler -Key UpArrow -Function HistorySearchBackward
Set-PSReadlineKeyHandler -Key DownArrow -Function HistorySearchForward
⑧c:\scriptのフォルダ作成
⑨powershellをいったん終了して起動
うまくいけばこんなメッセージが起動時でる
Windows PowerShell
Copyright (C) 2012 Microsoft Corporation. All rights reserved.


Id     Name            PSJobTypeName   State         HasMoreData     Location             Command
--     ----            -------------   -----         -----------     --------             -------
2      PowerShell.E...                 NotStarted    False                                           ...

Loaded 63 history item(s).
こんな感じでヒストリがロードされる


最後にMicrosoft UpdateをShellからするやりかた
情報元はこれ
http://blogs.technet.com/b/junichia/archive/2013/05/21/3573861.aspx
①まずモジュールを落とす
http://gallery.technet.microsoft.com/scriptcenter/2d191bcd-3308-4edd-9de2-88dff796b0bc
ここの
http://gallery.technet.microsoft.com/scriptcenter/2d191bcd-3308-4edd-9de2-88dff796b0bc/file/41459/43/PSWindowsUpdate.zip
②これを解凍したあとで同じくモジュールパスにコピー
結果こうなる
PS C:\Users\kouji\Documents\WindowsPowerShell\Modules\PSWindowsUpdate> dir


    ディレクトリ: C:\Users\kouji\Documents\WindowsPowerShell\Modules\PSWindowsUpdate


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2013/12/23      8:53       4198 Add-WUOfflineSync.ps1
-a---        2013/12/23     10:44       7774 Add-WUServiceManager.ps1
-a---        2013/12/23      8:53       8430 Get-WUHistory.ps1
-a---        2013/12/23     11:18      70258 Get-WUInstall.ps1
-a---        2013/12/23      8:53       1919 Get-WUInstallerStatus.ps1
-a---        2013/12/24     13:11      47136 Get-WUList.ps1
-a---        2013/12/23      9:31       7156 Get-WURebootStatus.ps1
-a---        2013/12/23      8:53       2343 Get-WUServiceManager.ps1
-a---        2013/12/23      8:53       1647 Get-WUUninstall.ps1
-a---        2013/12/24     13:14      42866 Hide-WUUpdate.ps1
-a---        2013/12/23      8:53       6020 Invoke-WUInstall.ps1
-a---        2013/12/23      8:53       5095 PSWindowsUpdate.Format.ps1xml
-a---        2013/12/24     13:14       9130 PSWindowsUpdate.psd1
-a---        2013/12/23     13:30        252 PSWindowsUpdate.psm1
-a---        2013/12/23      8:53       3089 Remove-WUOfflineSync.ps1
-a---        2013/12/23     10:44       5256 Remove-WUServiceManager.ps1
-a---        2013/12/23     14:47      19582 Update-WUModule.ps1


PS C:\Users\kouji\Documents\WindowsPowerShell\Modules\PSWindowsUpdate>
こんな感じ
③モジュールを認識させる
PS C:\Users\kouji>  Import-Module pswindowsupdate
④動作テスト
Get-Command -Module pswindowsupdate
で一覧が出る。
ついでにモジュールのアップデート
update-wumodule
⑤microsoft Updateをやってみる
 管理者権限で端末を起動後
 get-wulistで更新一覧取得
 get-wuinstallでアップデート




後はよく使うコマンド(firefoxとか)にaliasを切ればいける環境ができるはずだ。
grepとかsshとかも探せばあったはず。
あとこれ大文字小文字を区別しないのに注意




※)環境変数一覧などの取得について
PowerShellでは環境変数などのリソースを仮想ドライブとして管理する
その仮想ドライブは以下のようにするとリストできる

PS C:\Users\kouji> Get-PSDrive

Name           Used (GB)     Free (GB) Provider      Root                                               CurrentLocation

Alias                                  Alias
C                 184.78         11.79 FileSystem    C:\                                 
Cert                                   Certificate   \
D                  14.85         14.14 FileSystem    D:\
E                 205.60         15.70 FileSystem    E:\
Env                                    Environment
F                                      FileSystem    F:\
Function                               Function
HKCU                                   Registry      HKEY_CURRENT_USER
HKLM                                   Registry      HKEY_LOCAL_MACHINE
Variable                               Variable
WSMan                                  WSMan
X                1583.28        279.61 FileSystem    \\F-SERVER\disk1_pt1

このうち環境変数はEnvドライブにある。だから
get-childitem Env:
でOK

もしくは
Env:
でドライブ変えた後で
get-childitemとかlsとかdirで列記