結果出ました。

こんばんは。

今日は大晦日ですね。

ところで大晦日といえばアレです。

そう、年末ジャンボ宝くじ。

すでに結果が出ております。

実は私も10口だけ購入しておりました。



結果は・・・

6等のみ。

残念!


また来年がんばります。

よいお年を。



餅つき

今日は、実家で餅つきをしました。

毎年この30日にもちつきをしています。


写真は、もち米を蒸しているところです。
アルミ製のセイロを二段重ねています。

蒸した後は、機械のもちつき機で餅をつきます。
自分が生まれるずっと前は杵と臼でついてたらしいですが、さすがに今は機械です。
早速出来立てを昼にいただきました。
やはり出来立ては美味しいです。

この餅つきが終わると、いよいよ今年も終わりだなと実感します。
明日は大晦日。
ゆっくり過ごしたいと思います。


【PowerShell】フォルダ構成を保ったまま指定のファイルのバックアップを行う


単純にバックアップを行うには、Copy-Itemでフォルダごとコピーすればいいと思いますが、指定のファイルだけ、しかもフォルダ構成を保ったままコピーするには次のようにします。

PS C:\work> Copy-Item C:\work -Destination I:\Backup -Recurse -Filter "*.log" -Force
この例では、C:\work以下から拡張子が「log」のファイルをコピーしています。
ポイントは、Filterパラメータでコピーするファイルをフィルタリングしている点です。このFilterパラメータを使わないで単純にコピー元ファイルにワイルドカードで指定しただけではフォルダ構成を保ってのコピーはできません。

結果は、I:\Backup直下にフォルダ構成を保ったまま「work」フォルダが作られます。
ただし、拡張子が「log」以外のファイルはコピーされないので、「log」ファイルが存在しないフォルダは中身が空のフォルダだけが作成されます。

この方法は、例えばファイル名が同じでそれぞれ違うフォルダに入っているような場合に効果を発揮すると思います。



【PowerShell】コンソール画面をクリアにする


コンソール画面をクリアするには、Clear-Hostを使用します。

構文
Clear-Host

エイリアスは、clsまたはclearになります。



Clear-Hostを実行




画面がクリアされました。



【PowerShell】Write-Host


Write-Hostを使用すると、コンソールにメッセージを表示できます。

構文
Write-Host [[-Object] <オブジェクト>] [-NoNewline] [-Separator <オブジェクト>] [-ForegroundColor <コンソールカラー>] [-BackgroundColor <コンソールカラー>]

文字列を表示

PS C:\work> Write-Host "Hello PowerShell"
Hello PowerShell

-NoNewline

NoNewlineパラメータを使うと、改行が後ろに入りません。
PS C:\work> Write-Host "焼肉" -NoNewline ; Write-Host "定食"
焼肉定食

-Separator

Separatorパラメータを使うと、配列を指定したセパレータで区切って表示できます。
PS C:\work> Write-Host (1,2,3,4,5) -Separator "=="
1==2==3==4==5

PS C:\work> Write-Host ("a","b","c","d","e") -Separator "; "
a; b; c; d; e

テキストの色と背景色を変更する

ForegroundColorパラメータとBackgroundColorパラメータを使うことによって、文字の色と背景色を変更することが出来ます。
PS C:\work> Write-Host "Hello PowerShell" -foregroundcolor red -backgroundcolor yellow
Hello PowerShell
実行するとこんな感じになります。


この機能を使ってこんなことをしてみました。

なんかいろいろ遊べそうです。



【PowerShell】Write-Output


Write-Outputは、指定されたオブジェクトをパイプラインの次のコマンドに送ります。もしコマンドがパイプラインの最後のコマンドの場合、オブジェクトはコンソールに表示されます。

構文
Write-Output [-InputObject] <オブジェクト> [-NoEnumerate]


オブジェクトをコンソールに表示

おそらく単純にコンソールに表示するこの使い方が多いと思います。
PS C:\work> $p = Get-Process
PS C:\work> Write-Output $p

Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
-------  ------    -----      -----     ------     --  -- -----------
    275      16     9640      15592       0.05  16468  11 ApplicationFrameHost
    250      23    44800      43920       2.09    380  11 chrome
    335      33    67904      87852       3.13    936  11 chrome
    233      20    32104      32872       1.22   1208  11 chrome
    346      39    82904     107948       5.17   4304  11 chrome
    403      40    79928     118800      17.95   4348  11 chrome
この例では、Get-Processで取得したオブジェクトを変数$pに格納し、そしてWrite-Outputで$pをコンソールに表示しています。


パイプラインで次のコマンドに送る

PS C:\work> Write-Output "Hello PowerShell" | Get-Member
この例では、オブジェクト"Hello PowerShell"をパイプラインの次のコマンドGet-Memberに渡しています。




PayPalを使ってみた



今日、

オライリーで電子書籍を購入したのですが、

なんと、

その支払いを、

PayPalでしてしまいました!

まあ、そんな大げさなことじゃないんですけど、実は今回初めてPayPalを利用してみました。

ていうかPayPalの登録自体も初めてです。

もっと言うとオライリーの電子書籍があること自体、今日初めて知りました。

一応、決済は普通のクレジットカードでも出来たのですが、なんかオライリーのPayPal推しがすごくて流れで登録してしまいました。(笑)


いままでPayPalのことは名前ぐらいしか知らなくて、「クレジットカードの一種なのかな」ぐらいにしか考えてませんでした。

あとで調べて分かったのですが、PayPalというのはメールアドレスとパスワードだけで決済ができるというのが特徴で、クレジットカードの情報などを購入先に教えなくて済むようになっています。これにより今まで以上に簡単に、そして安心して買い物することが出来るようになっています。

日本ではまだあまり馴染みがないですが、海外では既に一般的な決済サービスとして利用されてるようです。

たまにクレジットカードでの決済に不安を感じてわざわざ代金引換してる友人とかいるんで、早く日本でも普及してほしいですね。



【PowerShell】Wordのテキストボックスに文字を入力する


PowerShellからWordのテキストボックスに文字を入力する方法です。

まず、ワードファイルに一つテキストボックスを貼り付けます。

今回ファイル名は、「TestWordFile.docx」としています。


次にテキストボックスに名前を付けます。

[ホーム]の[編集]から[選択]→[オブジェクトの選択と表示]を選びます。


そして名前を付けます。

今回、「TextBox1」と名前を付けました。


スクリプト
$word = New-Object -ComObject "Word.Application"
$word.Visible = $true

$word.Documents.Open("C:\work\TestWordFile.docx")
$shp = $word.ActiveDocument.Shapes("TextBox1")

$shp.TextFrame.TextRange.Text = "あいうえお"

少し解説すると、まず1行目でCOMオブジェクトを作成しています。

そして、4行目でファイルを開き、5行目でShapeオブジェクトを取得し、7行目で文字を入力しています。



結果は、このようになります。



【PowerShell】特殊フォルダを取得する


PowerShelで特殊フォルダを取得するには、.Net FrameworkのSystem.EnvironmentクラスのGetFolderPathメソッドを使用します。

構文
[Environment]::GetFolderPath('特別なフォルダーを識別する列挙定数')

主な特殊フォルダの表示例

#マイドキュメント
PS C:\work> [Environment]::GetFolderPath('MyDocuments')
C:\Users\hosopro\Documents

#マイミュージック
PS C:\work> [Environment]::GetFolderPath('MyMusic')
C:\Users\hosopro\Music

#マイピクチャ
PS C:\work> [Environment]::GetFolderPath('MyPictures')
C:\Users\hosopro\Pictures

#マイビデオ
PS C:\work> [Environment]::GetFolderPath('MyVideos')
C:\Users\hosopro\Videos

#デスクトップ
PS C:\work> [Environment]::GetFolderPath('Desktop')
C:\Users\hosopro\Desktop

#フォントが含まれる仮想フォルダ
PS C:\work> [Environment]::GetFolderPath('Fonts')
C:\WINDOWS\Fonts

#SendTo
PS C:\work> [Environment]::GetFolderPath('SendTo')
C:\Users\hosopro\AppData\Roaming\Microsoft\Windows\SendTo

#スタートアップ
PS C:\work> [Environment]::GetFolderPath('Startup')
C:\Users\hosopro\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

#現在のローミングユーザーのApplication Dataフォルダ
PS C:\work> [Environment]::GetFolderPath('ApplicationData')
C:\Users\hosopro\AppData\Roaming

#ローカルApplication Dataフォルダ
PS C:\work> [Environment]::GetFolderPath('LocalApplicationData')
C:\Users\hosopro\AppData\Local

その他の特殊フォルダについては、下記のサイトをご覧ください。
Environment.SpecialFolder 列挙型





【PowerShell】PowerShellのバージョンを確認する


PowerShellのバージョンを確認するには、$PSVersionTableを使います。

PS C:\work> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.1.14393.576
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.14393.576
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1




【PowerShell】TimeSpanオブジェクトを作成する


TimeSpanオブジェクトを作成するには、New-TimeSpanを使用します。

構文
New-TimeSpan [[-Start] <DateTime>] [[-End] <DateTime>]

New-TimeSpan [-Days <Int32>] [-Hours <Int32>] [-Minutes <Int32>] [-Seconds <Int32>]


TimeSpanオブジェクトの作成

PS C:\work> $TimeSpan = New-TimeSpan -Hours 1 -Minutes 15
PS C:\work> (Get-Date) + $TimeSpan

2016年12月21日 22:47:54
この例では、1時間15分のTimeSpanオブジェクトを作成しています。
作成したオブジェクトを使って、現在時刻に対して1時間15分後の時刻を表示しています。


開始と終了を指定してオブジェクトを作成

PS C:\work> New-TimeSpan -Start (Get-Date -Year 2016 -Month 12 -Day 1) -End (Get-Date -year 2017 -Month 1 -Day 1)


Days              : 31
Hours             : 0
Minutes           : 0
Seconds           : 0
Milliseconds      : 0
Ticks             : 26784000000000
TotalDays         : 31
TotalHours        : 744
TotalMinutes      : 44640
TotalSeconds      : 2678400
TotalMilliseconds : 2678400000
この例では、-Startパラメータで開始日を指定し、-Endパラメータで終了日を指定し、TimeSpanオブジェクトを作成しています。


ファイルの更新日からTimeSpanオブジェクトを取得

この例では、test.logが最後に更新されてからの経過時間しています。

パイプラインを使った方法
PS C:\work> dir .\test.log | New-TimeSpan


Days              : 28
Hours             : 4
Minutes           : 14
Seconds           : 12
Milliseconds      : 369
Ticks             : 24344523696573
TotalDays         : 28.1765320562188
TotalHours        : 676.23676934925
TotalMinutes      : 40574.206160955
TotalSeconds      : 2434452.3696573
TotalMilliseconds : 2434452369.6573

-Startパラメータを使った方法
PS C:\work> New-TimeSpan -Start (dir .\test.log).LastWriteTime


Days              : 28
Hours             : 4
Minutes           : 14
Seconds           : 38
Milliseconds      : 506
Ticks             : 24344785067793
TotalDays         : 28.1768345692049
TotalHours        : 676.244029660917
TotalMinutes      : 40574.641779655
TotalSeconds      : 2434478.5067793
TotalMilliseconds : 2434478506.7793




【PowerShell】システム時刻を指定した時刻に変更する


システム時刻を指定した時刻に変更するには、Set-Dateを使用します。

構文
Set-Date [-Date] <datetime>


-Date

-Dateパラメータを使って時刻を設定するには次のようにします。
PS C:\work> Set-Date -Date "2016/12/20 21:40"

2016年12月20日 21:40:00


AddDate

AddDateメソッドを使用して時刻を3日進めるには次のようにします。
PS C:\work> Set-Date -Date (Get-Date).AddDays(3)

2016年12月23日 21:42:42


-Adjust

-Adjustパラメータを使用して時刻変更するには次のようにします。
PS C:\work> Set-Date -Adjust -0:10:0

2016年12月20日 21:31:45
上の例では、10分戻しています。



【PowerShell】現在の日付と時刻を取得する


現在の日付と時刻を取得するには、Get-Dateを使用します。

構文
Get-Date [-DisplayHint <DateまたはTimeまたはDateTime>]

Get-Date [-Format <書式指定子>]

Get-Date [-UFormat <書式指定子>]


現在の日付と時刻を表示

PS C:\work> Get-Date

2016年12月18日 18:21:12


日付だけ表示

PS C:\work> Get-Date -DisplayHint Date

2016年12月18日


時刻だけ表示

PS C:\work> Get-Date -DisplayHint Time

18:28:36



書式を設定して表示する

PS C:\work> Get-Date -Format d
2016/12/18

PS C:\work> Get-Date -Format D
2016年12月18日

PS C:\work> Get-Date -Format f
2016年12月18日 18:44

PS C:\work> Get-Date -Format F
2016年12月18日 18:44:18

PS C:\work> Get-Date -Format g
2016/12/18 18:44

PS C:\work> Get-Date -Format G
2016/12/18 18:44:24

PS C:\work> Get-Date -Format M
12月18日

PS C:\work> Get-Date -Format O
2016-12-18T18:44:37.3080963+09:00

PS C:\work> Get-Date -Format R
Sun, 18 Dec 2016 18:44:54 GMT

PS C:\work> Get-Date -Format t
18:45

PS C:\work> Get-Date -Format T
18:45:04

PS C:\work> Get-Date -Format u
2016-12-18 18:45:07Z

PS C:\work> Get-Date -Format U
2016年12月18日 9:45:10

PS C:\work> Get-Date -Format Y
2016年12月

PS C:\work> Get-Date -Format ddd
日

PS C:\work> Get-Date -Format gg
西暦

PS C:\work> Get-Date -Format MMM
12

PS C:\work> Get-Date -Format MMMM
12月

PS C:\work> Get-Date -Format tt
午後
書式の詳細は、https://msdn.microsoft.com/library/system.globalization.datetimeformatinfo.aspx#Formatting_dates_timesを参照ください。


-UFormat

Get-Date -UFormat % で書式を設定して表示できます。
いくつか例を紹介します。
PS C:\work> Get-Date -UFormat %D
12/18/16

PS C:\work> Get-Date -UFormat %x
12/18/16

PS C:\work> Get-Date -UFormat %G
2016

PS C:\work> Get-Date -UFormat %Y
2016

PS C:\work> Get-Date -UFormat %b
12

PS C:\work> Get-Date -UFormat %W
50

PS C:\work> Get-Date -UFormat %a
日

PS C:\work> Get-Date -UFormat %R
18:51

PS C:\work> Get-Date -UFormat %p
午後
その他の設定値は、https://technet.microsoft.com/ja-JP/library/dd347647.aspxをご覧ください。



【Windows10】起動時にWindows Time サービスを起動させる

以前、Windows10の時刻自動設定がおかしいという記事を書いたのですが、すみません、時刻が同期されないのは別の原因だったことが分かりました。

まず、前提として、私の環境なんですが、Windows10とLinuxをデュアルブートしている環境なんです。そして、このデュアルブートの環境が、時刻のずれる原因の一つでした。
そしてもう一つ、Windowsのサービスの起動方法が影響していました。





OSの時刻の管理方法の違い

まずWindowsでは、起動時にハードウェアクロックから時刻を取得してきてOS側で管理しているのですが、このときWindowsはこのハードウェアクロックをローカルタイムとして認識しています。

次にLinuxですが、Linuxも同じように起動時にハードウェアクロックから時刻を取得しているのですが、このときLinuxはハードウェアクロックをUTCとして認識しているんです。

そして、このOSによるハードウェアクロックの認識の違いが、デュアルブートにおいて時刻のずれを引き起こします。

では、具体的に例をあげると次のようになります。

【PowerShell】カレンダー表示スクリプトを作ってみた


今年もあと残りわずかとなってきましたが、そろそろ来年のカレンダーの購入なんて考えてる方も多いのではないでしょうか。

そこでふと思ったのは、PowerShellでカレンダーの表示はできないものか?

調べたところ、どうやらそういうコマンドレットは無いらしいです。(当たり前か)

うーん・・・、じゃあ作るか!

そんなわけで、PowerShellでカレンダー表示スクリプトを作成してみました。


#カレンダー表示スクリプト

#パラメータ
Param($year, $month)

if (($year -eq $null) -And ($month -eq $null)){
    #両方nullなら今月
    $y = (Get-Date).Year
    $m = (Get-Date).Month
} elseif (($year -ne $null) -And ($month -ne $null)) {
    #パラメータがある場合は入力値の月
    $y = $year
    $m = $month
} else {
    #それ以外はエラー
    Write-Output 'パラメータが間違っています。[年] [月]を指定してください。'
    exit
}

#ついたちの曜日値を取得
$firstDayOfWeek = (Get-Date -Year $y -Month $m -Day 1).DayOfWeek.value__

#始まりの空白を設定
$startWeek = $firstDayOfWeek * 7 + 2
$space = ""
for ($j=0; $j -lt $startWeek; $j++){
    $space = $space + " "
}

#その月の最終日を取得
$nextMonthDate = (Get-Date -Year $y -Month $m -Day 1).AddMonths(1)
$lastDay = (Get-Date -Year $nextMonthDate.Year -Month $nextMonthDate.Month -Day 1).AddDays(-1).day

#年月表示
Write-Host $y"年"$m"月"

#曜日の表示
Write-Host "SUN    MON    TUE    WED    THU    FRI    SAT"

#日付部分を作成
$weekValue = $firstDayOfWeek
$dayString = $space
for ($i=1; $i -le $lastDay; $i++){

    if ($i -ge 9){
        $dayString = $dayString + $i + "     " 
    } else {
        $dayString = $dayString + $i + "      " 
    }
    
    $weekValue = $weekValue + 1

    if ($weekValue -eq 7) {
        #土曜日までいったら改行
        $dayString = $dayString.TrimEnd()
        if ($i -lt 9){
            $dayString = $dayString + "`n" + "  "
        } else {
            $dayString = $dayString + "`n" + " "
        }
        $weekValue = 0
    }
}

#日付の表示
Write-host $dayString.TrimEnd()
パラメータで年、月を指定すると、その年月のカレンダーが表示されます。
何も指定しなければ今月のカレンダーが表示されるようにしました。


実行するとこんな感じになります。

パラメータなし。
今月のカレンダーが表示されます。


パラメータあり。
2017年1月のカレンダーが表示されています。



【PowerShell】指定したファイルに対してデフォルトアクションを実行する


指定したファイルに対してデフォルトアクションを実行するには、Invoke-Itemを使用します。

構文
Invoke-Item [-Path] <ファイル名>


指定したファイルを開く

PS C:\work> Invoke-Item "TestWordFile.docx"
ファイルの拡張子に関連付け得られたアプリケーションで指定されたファイルが開きます。
この例では、Wordでファイルが開かれます。


ワイルドカードですべてのファイルを開く

PS C:\work> Invoke-Item "*.xlsx"
ワイルドカードによりすべてのファイルが開かれます。
この例ではExcelで「xlsx」ファイルが開かれます。




【PowerShell】コマンド履歴からコマンドを実行する


コマンド履歴からコマンドを実行するには、Invoke-Historyを使用します。

構文
Invoke-History [[-Id] <コマンドid>]


直前のコマンドを実行する

コマンド履歴の中から直前のコマンドを実行するには、単にInvoke-Historyと実行します。
PS C:\work> Invoke-History

ちなみにこのInvoke-Historyは履歴には残りません。


IDを指定して実行する

たとえばいま履歴がこのようになっていたとします。
PS C:\work> Get-History

  Id CommandLine
  -- -----------
   1 cd c:\work
   2 dir
   3 Start-Process -FilePath "notepad.exe"
   4 Get-Help Copy-Item

ここで、Id=3のコマンドを実行させるには次のようにします。

PS C:\work> Invoke-History -Id 3
Start-Process -FilePath "notepad.exe"



【PowerShell】コマンド履歴に追加する


コマンド履歴に追加するには、Add-Historyを使用します。

構文
Add-History [[-InputObject] <オブジェクト>]


CSVファイルからのインポート

コマンド履歴をCSVファイルに出力し、それをインポートして履歴に追加することが出来ます。

例えば、次のような履歴があったとします。
PS C:\work> Get-History

  Id CommandLine
  -- -----------
   1 cd c:\work
   2 dir
   3 Start-Process -FilePath "notepad.exe"
   4 Get-Help Copy-Item

これをCSVファイルにエクスポートします。
PS C:\work> Get-History | Export-Csv C:\work\history.csv

そして、次にこのCSVファイルをインポートします。
PS C:\work> Import-Csv .\history.csv | Add-History
PS C:\work>
PS C:\work> Get-History

  Id CommandLine
  -- -----------
   1 cd c:\work
   2 dir
   3 Start-Process -FilePath "notepad.exe"
   4 Get-Help Copy-Item
   5 Get-History | Export-Csv C:\work\history.csv
   6 Import-Csv .\history.csv | Add-History
   7 cd c:\work
   8 dir
   9 Start-Process -FilePath "notepad.exe"
  10 Get-Help Copy-Item
CSVファイルの履歴が後ろに追加されました。


オブジェクト変数に読み込んだリストを追加する

CSVファイルをオブジェクト変数に読み込み、履歴に追加する方法です。
PS C:\work> $a = Import-Csv C:\work\history.csv
PS C:\work> Add-History -InputObject $a -Passthru

  Id CommandLine
  -- -----------
   5 cd c:\work
   6 dir
   7 Start-Process -FilePath "notepad.exe"
   8 Get-Help Copy-Item
$aにインポートしたCSVデータを読み込み、-InputObjectパラメータで履歴を追加しています。

PS C:\work> Get-History

  Id CommandLine
  -- -----------
   1 cd c:\work
   2 dir
   3 $a = Import-Csv C:\work\history.csv
   4 Add-History -InputObject $a -Passthru
   5 cd c:\work
   6 dir
   7 Start-Process -FilePath "notepad.exe"
   8 Get-Help Copy-Item
読み込んだ履歴が後ろに追加されました。



【PowerShell】コマンド履歴をクリアする


コマンド履歴をクリアするには、Clear-Historyを使用します。

構文
Clear-History [[-Id] <コマンドid>] [[-Count] <クリアするエントリ数>] [-Newest]


履歴を全てクリアする

例えば下記のようにコマンド履歴があったとします。
PS C:\work> Get-History

  Id CommandLine
  -- -----------
   1 cd c:\work
   2 dir
   3 Start-Process -FilePath "notepad.exe"
   4 Get-History
   5 Get-Help Get-ChildItem

この履歴をすべてクリアするには単純にClear-Historyを実行します。
PS C:\work> Clear-History
PS C:\work>
PS C:\work> Get-History

  Id CommandLine
  -- -----------
   7 Clear-History
Clear-Historyを実行する前の履歴がすべてクリアされました。



-Id

指定したIDのコマンドをクリアします。
例えば下記のようにコマンド履歴があったとします。
PS C:\work> Get-History

  Id CommandLine
  -- -----------
   1 cd c:\work
   2 Get-ChildItem
   3 Get-Help Copy-Item
   4 Get-Clipboard
   5 Get-Clipboard

この履歴のId=3のコマンドをクリアするには次のようします。
PS C:\work> Clear-History -Id 3
PS C:\work>
PS C:\work> Get-History

  Id CommandLine
  -- -----------
   1 cd c:\work
   2 Get-ChildItem
   4 Get-Clipboard
   5 Get-Clipboard
   6 Get-History
   7 Clear-History -Id 3
Id=3のコマンドがクリアされました。



直近の指定した数分コマンドをクリア

例えば下記のようにコマンド履歴があったとします。
PS C:\work> Get-History

  Id CommandLine
  -- -----------
   1 cd c:\work
   2 Get-ChildItem
   4 Get-Clipboard
   5 Get-Clipboard
   6 Get-History
   7 Clear-History -Id 3

この履歴の直近の3つのコマンドをクリアするには次のようにします。
PS C:\work> Clear-History -Count 3 -Newest
PS C:\work>
PS C:\work> Get-History

  Id CommandLine
  -- -----------
   1 cd c:\work
   2 Get-ChildItem
   4 Get-Clipboard
   5 Get-Clipboard
   9 Clear-History -Count 3 -Newest



指定したIDからCount数分遡って履歴をクリア

例えば下記のようにコマンド履歴があったとします。
PS C:\work> Get-History

  Id CommandLine
  -- -----------
   1 cd c:\work
   2 Get-ChildItem
   4 Get-Clipboard
   5 Get-Clipboard
   9 Clear-History -Count 3 -Newest
  10 Get-History
  11 Get-History
  12 Start-Process -FilePath "notepad.exe"

この履歴から、Id=5から遡って3つのコマンド履歴をクリアするには次のようにします。
PS C:\work> Clear-History -Id 5 -Count 3
PS C:\work>
PS C:\work> Get-History

  Id CommandLine
  -- -----------
   1 cd c:\work
   9 Clear-History -Count 3 -Newest
  10 Get-History
  11 Get-History
  12 Start-Process -FilePath "notepad.exe"
  13 Get-History
  14 Clear-History -Id 5 -Count 3
2, 4, 5のコマンドがクリアされました。



【PowerShell】入力されたコマンドの履歴を取得する


入力されたコマンドの履歴を取得するには、Get-Historyを使用します。

構文
Get-History [[-Id] <コマンドid>] [[-Count] <最近の履歴エントリ数>]


パラメータを何もつけないで実行したときです。
最新の32個のコマンドが表示されます。
PS C:\work> Get-History

  Id CommandLine
  -- -----------
   1 cd c:\work
   2 Get-ChildItem
   3 Start-Process -FilePath "notepad.exe"

-Id

指定したIDのコマンドを表示します。
PS C:\work> Get-History -Id 2

  Id CommandLine
  -- -----------
   2 Get-ChildItem

-Count

指定した数分の直近の履歴を表示します。
PS C:\work> Get-History -Count 3

  Id CommandLine
  -- -----------
   3 Start-Process -FilePath "notepad.exe"
   4 Get-History
   5 Get-History -Id 2

-Idと-Countの組み合わせ

指定したIDからCount数分遡って履歴を表示します。
PS C:\work> Get-History -Id 4 -Count 3

  Id CommandLine
  -- -----------
   2 Get-ChildItem
   3 Start-Process -FilePath "notepad.exe"
   4 Get-History




WELQ問題で思うこと

この前、ネットで健康関連のことを検索しててたまたま出てきた記事をクリックしたところ、「現在この記事は非公開になっています。お詫び申し上げます・・・」的なことが表示されててアレッ!?って思ったんですが、その翌日ぐらいにニュースで大きく報じられ、ああ、あれはWELQの記事だったんだなと納得しました。

「成長を追い求めすぎた」──DeNA守安社長、キュレーションメディア問題に謝罪 南場会長もコメント
DeNAの説明だと医療・健康に関する不正確な情報の内容を記載してたとして11月下旬、WELQ全記事を非公開にしたそうです。

問題は、専門家の監修のないまま記事を掲載していたのと、他サイトの記事をパクってたことなんですが、いや~ひどいですね。個人がやってるならまだしも、DeNAというべイスターズの親会社にもなっている大きな会社がこういうことしてるっていうのは信じられないというか、まったく企業体質自体を疑いたくなってきますね。

そもそもなんでこんなキュレーションサイトの運営に手を出したんですかね。たしかDeNAってゲーム作ってる会社ですよね。ゲームだけじゃやってけないんですかね?ていうかキュレーションサイトってそんなに儲かるんですかね?

たぶん儲かるんでしょうね。ここ3年ぐらいじゃないですか、こういうキュレーションサイトが増えてきたのって。おそらく、みんながスマホでネットにアクセスするようになって、それでグノシーとかスマートニュースとかLINEニュースで記事を読むようになったっていうのが大きいと思うんですよ。自分なんかも電車乗ってるときとかに暇つぶしに見てしまうんですが、スマホで見てると間違って広告をタップしてしまうことってよくあるんです。だから、PCで見るよりクリック率が高いんじゃないですかね。

ただ、こういうキュレーションサイトってどうなんですかね。なかには面白い記事もあるんですが、だいたいはタイトル倒れだったり、中身の薄いどうでもいいことが書いてあったり、それってほんと?って思えるようなことが書いてあったりします。なんで正直もう飽き飽きしてるというか、キュレーションサイト多すぎ!って思います。

それとあと他にも問題ありますよ。
こんなキュレーションサイトの記事がどうやって作られてるかってことですよ。

私は以前個人事業主で働いてて、仕事をクラウドワークスやランサーズ、@SOHOといった、いわゆるクラウドソーシングと言われるところから得てたりしてたんですが、そういうところにはライティングの仕事が結構あるんですよね。

自分はシステム開発が仕事なんでそういうライティングの仕事はしたことないんですが、だいたい1件あたり2000文字以上で3000~5000円という感じで出ています。中には1記事1000文字以上で200~300円という単価のところもあります。1記事200円ですよ。そんなの絶対割に合わないですよ。自分で取材して記事にするなんて絶対無理です。はっきり言って他のサイトから記事をパクってくるしかないですよ、こんな安かったら。

今回問題になったWELQもパクリ記事が結構あったみたいですし、その背景にはこういうクラウドソーシングの安い単価の問題も隠されてるんじゃないですかね。

大企業が安い労働力で利益を得ている。
まさにブラックですね。
今の日本経済の縮図がここに表れてるんじゃないでしょうか。




Linux Mint にSophos Anti-Virus for Linux(Free Edition)を入れてみた

自宅のパソコンでLinux MintをWindows10とデュアルブートして使っているのですが、ウィルス対策ソフトは入れてません。
Linuxなんで無くても大丈夫かなと思うんですが、ただ全く脅威が無いわけではないので入れてるに越したことはないと思うんですよね。

ネットで探すとLinuxでも無料で使えるウィルス対策ソフトがいくつか出てきます。
そんなわけで、今日試しにLinux MintにSophos Anti-Virus for Linux(Free Edition)を入れてみました。

【PowerShell】新しいWindowsサービスを登録する


新しいWindowsサービスを登録するには、New-Serviceを使用します。

構文

New-Service -Name <サービス名> -BinaryPathName <サービスプログラム名> -DisplayName <表示名> -StartupType <スタートアップ種類> -Description <説明>


表示名、スタートアップの種類、説明を含むサービスの作成

PS C:\> New-Service -Name "TestService" -BinaryPathName "C:\work\Service\ServiceProgramTest.exe" -DisplayName "Test Service" -StartupType Manual -Description "This is a test service."

Status   Name               DisplayName
------   ----               -----------
Stopped  TestService        Test Service


追加したサービスの表示

PS C:\> Get-WmiObject win32_service -Filter "name='TestService'"


ExitCode  : 0
Name      : TestService
ProcessId : 9672
StartMode : Manual
State     : Running
Status    : OK



サービスの削除

サービスを削除するには、次のいずれかで行います。
PS C:\> sc.exe delete TestService
[SC] DeleteService SUCCESS

PS C:\> (Get-WmiObject win32_service -Filter "name='TestService'").delete()


__GENUS          : 2
__CLASS          : __PARAMETERS
__SUPERCLASS     :
__DYNASTY        : __PARAMETERS
__RELPATH        :
__PROPERTY_COUNT : 1
__DERIVATION     : {}
__SERVER         :
__NAMESPACE      :
__PATH           :
ReturnValue      : 0
PSComputerName   :



【PowerShell】サービスのスタートアップの種類を設定する


サービスのスタートアップの種類をを設定するには、Set-Serviceを使用します。

構文

Set-Service -Name <サービス名> -StartupType <種類>


自動

PS C:\> Set-Service -Name 'MSSQL$MSSQLSERVER2016' -StartupType 'Automatic'


手動

PS C:\> Set-Service -Name 'MSSQL$MSSQLSERVER2016' -StartupType 'Manual'


無効

PS C:\> Set-Service -Name 'MSSQL$MSSQLSERVER2016' -StartupType 'Disabled'



【PowerShell】サービスを再開する


サービスを再開するには、Resume-Serviceを使用します。

構文

Resume-Service -Name <サービス名>

Resume-Service -DisplayName <表示名>


-Name

PS C:\> Resume-Service -Name 'MSSQL$MSSQLSERVER2016'
サービス名が「MSSQL$MSSQLSERVER2016」のサービスを再開する例です。


-DisplayName

PS C:\> Resume-Service -DisplayName 'SQL Server (MSSQLSERVER2016)'
表示名が「SQL Server (MSSQLSERVER2016)」のサービスを再開する例です。


※サービス名、表示名で指定する名前は、シングルコーテーションで囲んだほうがいいようです。
-Nameの例のように中に「$」が入っているとダブルコーテーションではうまく認識されないようです。



【PowerShell】サービスを一時停止する


サービスを一時停止するには、Suspend-Serviceを使用します。

構文

Suspend-Service -Name <サービス名>

Suspend-Service -DisplayName <表示名>


-Name

PS C:\> Suspend-Service -Name 'MSSQL$MSSQLSERVER2016'
PS C:\>
PS C:\> Get-Service -Name 'MSSQL$MSSQLSERVER2016'

Status   Name               DisplayName
------   ----               -----------
Paused   MSSQL$MSSQLSERV... SQL Server (MSSQLSERVER2016)
サービス名が「MSSQL$MSSQLSERVER2016」のサービスを一時停止する例です。



-DisplayName

PS C:\> Suspend-Service -DisplayName 'SQL Server (MSSQLSERVER2016)'
PS C:\>
PS C:\> Get-Service -DisplayName 'SQL Server (MSSQLSERVER2016)'

Status   Name               DisplayName
------   ----               -----------
Paused   MSSQL$MSSQLSERV... SQL Server (MSSQLSERVER2016)
表示名が「SQL Server (MSSQLSERVER2016)」のサービスを一時停止する例です。



※サービス名、表示名で指定する名前は、シングルコーテーションで囲んだほうがいいようです。
-Nameの例のように中に「$」が入っているとダブルコーテーションではうまく認識されないようです。



【PowerShell】サービスの再起動する


サービスの再起動を行うには、Restart-Serviceを使用します。

構文
Restart-Service -Name [サービス名]

Restart-Service -DisplayName [表示名]


-Name

PS C:\> Restart-Service -Name 'MSSQL$MSSQLSERVER2016'
サービス名が「MSSQL$MSSQLSERVER2016」のサービスを再起動する例です。


-DisplayName

PS C:\> Restart-Service -DisplayName 'SQL Server (MSSQLSERVER2016)'
表示名が「SQL Server (MSSQLSERVER2016)」のサービスを再起動する例です。



※サービス名、表示名で指定する名前は、シングルコーテーションで囲んだほうがいいようです。
-Nameの例のように中に「$」が入っているとダブルコーテーションではうまく認識されないようです。



【PowerShell】サービスを停止する


サービスを停止するには、Stop-Serviceを使用します。

構文
Stop-Service -Name <サービス名>

Stop-Service -DisplayName <表示名>


-Name

PS C:\> Stop-Service -Name 'MSSQL$MSSQLSERVER2016'
サービス名に「MSSQL$MSSQLSERVER2016」を指定した例です。


-DisplayName

PS C:\> Stop-Service -DisplayName 'SQL Server (MSSQLSERVER2016)'
表示名に「SQL Server (MSSQLSERVER2016)」を指定した例です。



※サービス名、表示名で指定する名前は、シングルコーテーションで囲んだほうがいいようです。
-Nameの例のように中に「$」が入っているとダブルコーテーションではうまく認識されないようです。



【PowerShell】サービスを開始する


サービスを開始するには、Start-Serviceを使用します。

構文
Start-Service -Name [サービス名]

Start-Service -DisplayName [表示名]


-Name

PS C:\> Start-Service -Name "MSSQL*"
この例では、サービス名が「MSSQL」から始まるサービスを開始しています。


-DisplayName

PS C:\> Start-Service -DisplayName "SQL Server*"
この例では、表示名が「SQL Server」で始まるサービスを開始しています。



【PowerShell】サービスを取得する


サービスを取得するには、Get-Serviceを使用します。

構文
Get-Service -Name [サービス名]

Get-Service -Displayname [表示名]

サービスの一覧を表示

PS C:\> Get-Service
登録されているサービスの一覧が表示されます。


-Name

PS C:\> Get-Service -Name "SQL*"

Status   Name               DisplayName
------   ----               -----------
Stopped  SQLAgent$MSSQLS... SQL Server エージェント (MSSQLSERVE...
Stopped  SQLAgent$SQLEXP... SQL Server エージェント (SQLEXPRESS...
Stopped  SQLBrowser         SQL Server Browser
Running  SQLTELEMETRY$MS... SQL Server CEIP service (MSSQLSERVE...
Running  SQLWriter          SQL Server VSS Writer
サービスの「Name」がSQLで始まるサービスの一覧を表示しています。


-Displayname

PS C:\> Get-Service -DisplayName "SQL*"

Status   Name               DisplayName
------   ----               -----------
Running  MSSQL$MSSQLSERV... SQL Server (MSSQLSERVER2016)
Running  MSSQL$SQLEXPRES... SQL Server (SQLEXPRESS2014)
Running  MSSQLFDLauncher... SQL Full-text Filter Daemon Launche...
Stopped  SQLAgent$MSSQLS... SQL Server エージェント (MSSQLSERVE...
Stopped  SQLAgent$SQLEXP... SQL Server エージェント (SQLEXPRESS...
Stopped  SQLBrowser         SQL Server Browser
Running  SQLTELEMETRY$MS... SQL Server CEIP service (MSSQLSERVE...
Running  SQLWriter          SQL Server VSS Writer
サービスの「DisplayName」がSQLで始まるサービスの一覧を表示しています。


現在アクティブなサービスを表示する

PS C:\> Get-Service | Where-Object {$_.Status -eq "Running"}



【PowerShell】プロセスをデバッグする


実行中のプロセスをデバッグするには、Debug-Processを使用します。

構文
Debug-Process -Name [プロセス名]

Debug-Process -Id [プロセスID]

Debug-Process -InputObject [オブジェクト変数]


PS C:\> Debug-Process -Name "HelloPowerShell"

対象のプロセスが実行されてる状態でこのように実行すると、デバッガーの選択画面が表示されます。


デバッガーを選択してOKボタンを押すとデバッガーが起動してきます。

この例では、VisualStudioを起動しているのですが、起動したあとのデバッグのやり方はよく分かりませんでした。

ソリューションエクスプローラーで「新しいインスタンスにステップイン」を行えばソースコードが表示されデバッグが行えるのですが、ただそれだと実行中のプロセスではなく新たに起動したプロセスに対してデバッグすることになってしまいます。

ネットでも調べたのですが、この辺のことはよく分かりませんでした。
まあ、PowerShellとはまた別問題ですので、今後また何か分かりましたら書きたいと思います。



【PowerShell】プロセスの停止を待つ


プロセスの停止を待つには、Wait-Processを使います。

構文
Wait-Process -Name [プロセス名]

Wait-Process -Id [プロセスID]

このWait-Processを使うと、指定したプロセスが停止するまでプロンプトの受付が抑制されます。


-Name

プロセス名を指定する方法です。
PS C:\> Wait-Process -Name "notepad"

この例では、メモ帳が終了するまで待機しています。


-Id

プロセスIDを指定する方法です。

PS C:\> Wait-Process -Id 2416


-Timeout

「-Timeout」パラメータを使うと、指定した時間(秒)だけ停止するのを待つことができます。
PS C:\> Wait-Process -Name "notepad" -Timeout 30

この例では、30秒間停止を待ちます。



【PowerShell】プロセスを開始する


プロセスを開始させるには、Start-Processを使います。

構文
Start-Process -FilePath [ファイル名]


まず、一番単純な例です。
PS C:\> Start-Process -FilePath "notepad.exe"
-FilePathに「notepad.exe」を指定してメモ帳を起動しています。
ちなみにnotepad.exeはダブルコーテーションで括らなくても大丈夫です。

あと、指定するファイル名は実行ファイルじゃなくても大丈夫です。

たとえば「test.log」というテキストファイルを指定したとします。
もし、この「log」という拡張子にメモ帳が関連付けられていた場合、ちゃんとメモ帳が起動して「test.log」を開いてくれます。



次に、最大化されたウィンドウでプロセスを開始する方法です。
PS C:\> Start-Process -FilePath "notepad" -WindowStyle Maximized
-WindowStyleパラメータで「Maximized」を指定します。


-Verb

管理者として実行するには下記のようにします。
PS C:\> Start-Process -FilePath "powershell" -Verb runAs

また、-Verbを使って印刷も出来ます。
PS C:\> Start-Process -FilePath "test.log" -Verb Print


-Wait

プロセスの終了を待つ
PS C:\> Start-Process -FilePath "notepad" -Wait
「-Wait」パラメータを指定することにより起動したプロセスが終了するまでプロンプトの操作はできなくなります。


-WorkingDirectory

PS C:\> Start-Process -FilePath "test.pdf" -WorkingDirectory "C:\work"
「-WorkingDirectory」パラメータは、作業場所となるディレクトリを指定することにより、そのディレクトリにあるファイルを実行することができます。



【PowerShell】実行中のプロセスを停止する


実行中のプロセスを中止するには、Stop-Processを使います。

構文
Stop-Process -Name [プロセス名]

Stop-Process -Id [プロセスID]

Stop-Process -InputObject [オブジェクト変数]


まず、プロセス名を指定する方法です。
PS C:\> Stop-Process -Name "excel"
ここでは、「excel」を指定しています。
ちなみにダブルコーテーションは無くても大丈夫です。



次に、プロセスIDを指定する方法です。


いまこのようにExcelがID:392で起動していたとします。
このプロセスを停止するには次のようにします。
PS C:\> Stop-Process -Id 392



次に、オブジェクト変数を使った方法です。


いま、メモ帳が起動していたとします。

PS C:\> $proc = Get-Process -Name notepad
PS C:\> Stop-Process -InputObject $proc
PS C:\> $proc | Where-Object {$_.HasExited}

Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
-------  ------    -----      -----     ------     --  -- -----------
    226      15     3484      17060       0.06  12644  16 notepad

まず、Get-Processで名前が「notepad」のプロセスを取得して変数$procに格納します。
そして、Stop-Processの「-InputObject」で$procを指定してプロセスを停止しています。

このオブジェクト変数を使うことにより、3行目のようにHasExitedプロパティでプロセスが停止したか確認ができます。



【PowerShell】実行中のプロセスを取得する


ローカルPCまたはリモートPCの実行中のプロセスを取得するには、Get-Processを使います。

構文
Get-Process -Name [プロセス名]

Get-Process -Id [プロセスID]


まず、単純にローカルPCの実行中のプロセス一覧を表示させるには下記のようにします。
PS C:\> Get-Process

結果はこのようになります。



次に名前を指定してプロセス一覧を表示させます。
たとえば、exで始まるプロセス一覧を表示させるには以下のようにします。
PS C:\> Get-Process -Name ex*

結果はこのようになります。



次にプロセスIDを指定して表示させます。
上で表示させたExcelのIDを指定してみたいと思います。
PS C:\> Get-Process -Id 10048

結果はこのようになります。



次に実行ファイルのバージョンを表示させるには下記のようにします。
PS C:\> Get-Process -Name excel -FileVersionInfo

結果はこのようになります。



次に、プロセスの詳細情報を表示させるには下記のようにします。
PS C:\> Get-Process -Name excel | Format-List *

結果はこのようになります。
Name                       : EXCEL
Id                         : 10048
PriorityClass              : Normal
FileVersion                : 15.0.4875.1000
HandleCount                : 799
WorkingSet                 : 66961408
PagedMemorySize            : 27009024
PrivateMemorySize          : 27009024
VirtualMemorySize          : 535175168
TotalProcessorTime         : 00:00:02.5000000
SI                         : 15
Handles                    : 799
VM                         : 535175168
WS                         : 66961408
PM                         : 27009024
NPM                        : 48592
Path                       : C:\Program Files (x86)\Microsoft Office\Office15\EXCEL.EXE
Company                    : Microsoft Corporation
CPU                        : 2.5
ProductVersion             : 15.0.4875.1000
Description                : Microsoft Excel
Product                    : Microsoft Office 2013
__NounName                 : Process
BasePriority               : 8
ExitCode                   : 
HasExited                  : False
ExitTime                   : 
Handle                     : 2788
SafeHandle                 : Microsoft.Win32.SafeHandles.SafeProcessHandle
MachineName                : .
MainWindowHandle           : 132852
MainWindowTitle            : Book1 - Excel
MainModule                 : System.Diagnostics.ProcessModule (EXCEL.EXE)
MaxWorkingSet              : 1413120
MinWorkingSet              : 204800
Modules                    : {System.Diagnostics.ProcessModule (EXCEL.EXE), System.Diagnostics.ProcessModule (ntdll.dll), System.Diagnostics.ProcessModule (wow64.dll), System.Diagnostics.ProcessModule (wow64win.dll)...}
NonpagedSystemMemorySize   : 48592
NonpagedSystemMemorySize64 : 48592
PagedMemorySize64          : 27009024
PagedSystemMemorySize      : 938696
PagedSystemMemorySize64    : 938696
PeakPagedMemorySize        : 115884032
PeakPagedMemorySize64      : 115884032
PeakWorkingSet             : 141869056
PeakWorkingSet64           : 141869056
PeakVirtualMemorySize      : 684355584
PeakVirtualMemorySize64    : 684355584
PriorityBoostEnabled       : True
PrivateMemorySize64        : 27009024
PrivilegedProcessorTime    : 00:00:01.0156250
ProcessName                : EXCEL
ProcessorAffinity          : 255
Responding                 : True
SessionId                  : 15
StartInfo                  : System.Diagnostics.ProcessStartInfo
StartTime                  : 2016/11/26 17:44:43
SynchronizingObject        : 
Threads                    : {6328, 6912, 12548, 9032...}
UserProcessorTime          : 00:00:01.4843750
VirtualMemorySize64        : 535175168
EnableRaisingEvents        : False
StandardInput              : 
StandardOutput             : 
StandardError              : 
WorkingSet64               : 66961408
Site                       : 
Container                  : 



最後にそのプロセスによりロードされているモジュールを表示させるには下記のようにします。
PS C:\> Get-Process -Name excel -Module

結果はこのようになります。