ふと、PowerShellでMac OS Xのsayコマンドのようにテキストを合成音声で読み上げさせることができないかと思い調べてみたところ、Add-Typeで.NetのSpeechSynthesizerを追加したらできそうだったので、試しにやってみることにした。 なお、OSはWindows 10を用いている。


Windowsで、Linuxのようにinotify-toolsを使ってファイルの作成や編集、削除について検知とかをするにはどうすればいいのかなと思って調べてみた。 どうやら、PowerShellでもやろうと思えばできるようだ。 Windowsでinotifyのようにファイルのイベントを検知する場合は「System.IO.FileSystemWatcher」を用いることで同様のことが行える。

参考元に記述されているようなPowerShellスクリプトを記述することで、指定されたログに監視PATHで発生したイベントをログに記録させることができるようだ。 ちょっとだけ記述を変えて試してみたので、...


Windowsで更新日が○日前のファイルを削除する方法

先日、Twitterで『Windowsで更新日が◯日前のファイルを削除する方法』について見かけたので、そういえばどのくらいあるんだろう?と思って調べてみた。
もともとPowerShellではできるであろうとは認識してたので、他にもお手軽な方法があるのかなと。

1.PowerShellの場合

まぁ、PowerShellでやる方法についてはMicroSoftでも公式で例を出してるので…。
PowerShellの2と3で、以下のようなやり方があるようだ。

PowerShell2

Get-ChildItem パス名 –Recurse | Where-Object{$_.Crea...

WindowsでBatchやPowerShellを用いて、Linuxと同じように空ファイルや空ディレクトリを抽出、それらを一括削除する方法があるかを調べてみた。

1.空ファイルの削除

カレントディレクトリ配下の空ファイルを一括削除する場合、以下のようにする。
(PowerShellの方は再帰的に削除させている)

Batch(cmd)の場合

for %F in (*) do if %~zF equ 0 del "%F"

PowerShellの場合

get-childItem -recurse | where {$_.length -eq 0} | remove-It...

WindowsのBatch(cmd)/PowerShellでファイルの空行を削除する

以前、LinuxやMacのコンソール上での空行削除についてまとめたが、Windowsではどうするのだろう?と思ったので、少し調べてみた。
さすがにLinuxやMacほど応用は効かないしわかりにくい、タイピングしにくい…LinuxやUNIXに慣れてるとかなり扱いづらいけど、とりあえず実現はできるようだ。

1.Batch(cmd)でファイルのすべての空行を削除する

Batch(コマンドプロンプト)でファイルのすべての空行を削除する場合、以下のようにする。

findstr /v /r /c:"^\ *$" 対象ファイル

C:\Users\test>type blank_te...

仕事でAzure Blob Storageをいじってるのだけど、ポータル画面からだとスナップショットの取得ができなそうなので、PowerShellから取ってみる事にした。

残念ながら、コンテナ単位でSnapshotを取得する事は出来ないようで、オブジェクト単位での取得をする必要があるようだ。

# Blob Storageに関する情報
# StorageAccountName: Blobアカウント名
# StorageAccountKey : Blobアクセスキー
# ContainerName : Blobコンテナ名
# BlobName : Blob名
$StorageAccount...

LinuxのコンソールなどからコマンドでDatadogのDashboardとかを編集したり、イベントの通知をする場合はDatadogpyなどを用いれば良いのだが、Windows Server上からコマンドで実行させたい事があった。
で、結論としてはDatadogではRestAPIが用意されているので、PowerShellでそれ経由で処理させれば良い。

●datadog-sample.ps1

# ----------------------
# Datadog Powershellイベント通知スクリプト(Sample)
# ----------------------

$url_...

WindowsでLinux/UNIXのtouchコマンド相当(0Byteのファイル作成)の処理

Windowsでサンプルファイル(0Byteのファイルを20個くらい)を作成する事になったので、Linuxでいうtouchコマンドに当たるコマンドについて調べてみた。
といっても、別にタイムスタンプ変える事は考えず、単に空ファイル作成するだけなのだが。

コマンドプロンプトとPowerShell、それぞれで0Byteのファイルを作るコマンドは以下のようだ。

コマンドプロンプトで作成する

コマンドプロンプトで0Byteのファイルを作成する場合は、以下のようにnul(Linuxでいう/dev/null)をコピーして作成する方法がある。

copy nul 作成するファイル名(PATH...

今までに、SSHでの選択型の自動ログインについてはTeratermマクロPythonのスクリプトを作ってみたりしたが、そういえばRDPの接続ではやってないなぁ…
と思ったので、簡素なものではあるがPowerShellで作ってみた。

まぁ、転職するので今後Windowsサーバを仕事で使うことがあるのやら不明だけど。
次のクライアントMacだし。

作りは、ホストのIPアドレスやらユーザ、パスワードを記述した「host.list」とスクリプト本体である「RDP_CONNECT.ps1」の2つ。
同じディレクトリ配下においておく。

1.host.list

「host.l...


仕事で、PowerShellから対象URLのステータス状態(200とか404とか)を取得する必要があったので、その備忘。
PowerShellでその辺りの情報を取得する場合は、以下のように記述する。

$url = "対象URL"
[System.Net.HttpWebRequest]$REQUEST = [System.Net.WebRequest]::Create($url)
$RESPONSE = $REQUEST.GetResponse()
$RESPONSE.Close()
[int]$RESPONSE.StatusCode


Windowsでファイル名・フォルダ名の一括置換を行う

UNIX、Linuxと同様に、Windowsでもファイル名やフォルダ名を一括で置換したいときがある。
そんな時はどうすればよいのか?

1.コマンドプロンプトから置換を行う

非常に限定的な用途(拡張子をtxtからbatに変換する等)であれば、コマンドプロンプトからrenコマンドを使うと良いだろう。

ren リネーム前 リネーム後

ただ、このコマンドでちゃんとした置換(たとえば、「TEST」というキーワードを「A」と変える)は難しい。
というのも、普通にコマンドを実行すると、以下の画像のようになってしまうからだ。

手軽ではあるのだが、ちゃんとした置換であれば別の手段...


PowerShellで『PSTerminalServices』を使ってリモートデスクトップの接続クライアントのIPアドレスを調べる

Windowsにリモートデスクトップで繋げる際、セッション数などの問題から、現在サーバに接続しているユーザーとその接続元IPアドレス、ホスト名などを知りたい時がある。 UNIXの場合だと、whoコマンド、lastコマンドで接続元IPアドレスとそのユーザーが取得できるのだが、WindowsのDOSコマンドで使える「query session」だと、接続しているユーザーまではわかるが、接続元IPアドレスまでは取得することが出来ない。いちいち接続しているユーザーを元にイベントログから推測して調べるのも効率的ではない。

そんなときは、今回紹介する『PSTerminalServices』モジュールを...


PowerShellのStart-TranscriptでDOSコマンドの実行結果が保存されない時の対処法

LinuxやUNIXにあるscriptコマンドと同様に、PowerShellにも操作ログを記録するコマンドが存在する。それが『Start-Transcript(Stop-Transcript)』だ。 さて、このコマンドでログを記録する際、ちょっと困った挙動がある。コマンドプロンプト(cmd.exe)のコマンドを実行すると、ログに記録されないのだ…。

実際に、以下のようなコマンドを実行したとしよう。

Start-Transcript
Get-ChildItem
ipconfig
Stop-Transcript

しかし、出力されるログは以下のようになってしまう。

*******...

WindowsのPowerShellでファイルのフルパスを取得する

以前、Windowsのコマンドプロンプトからファイルのフルパスを取得した事があったのだが、今回はそれをPowerShellで行ってみる。

PowerShellで指定したフォルダ配下のファイルのフルパスを出力する場合、以下のように記述すると良いだろう。

Get-ChildItem -Recurse 指定したフォルダ | ?{ $_.Length -ne $null } | Select-Object Fullname

上記コマンドについて一応解説しておくと、

  • 「Get-ChildItem -Recurse 指定したフォルダ」で指定したフォルダ配下の一覧を取得
  • 「?{ $_...

PowerShellでsed相当の処理を行う

LinuxやUNIXには、ファイルや変数、文字列の置換を行えるsedというコマンドが用意されている。
それと同じことをPowerShellで行う場合、どうすればよいのだろうか。

1.特定の文字列を置換する

基本の使い方である、特定の文字列をただ置き換える場合は「-replace」を利用すればいい。

Get-Content .\test.txt | % { $_ -replace "置換する文字列","置換後の文字列" }

2.上書き保存する

sedの「-i」オプション相当の処理を行わせるには、ただパイプで「Set-Content」「Out-File」を行えば良い、...


PowerShellでwatch相当の処理を行う

Linuxではおなじみのwatchコマンド。
これと同等の事をPowerShellで実行する場合、Whileコマンドをうまく組み合わせる事で実現可能だ。

while ($true -eq $true) { 実行させたいコマンド ; sleep 1 ; clear}

実際に実行させた例が以下。
1秒ごとにディレクトリ配下のファイル一覧を取得させている。

while ($true -eq $true) { Get-...

PowerShellでhead,tail相当の処理を行う

LinuxやUNIXを利用している方であれば特に説明する必要も無いが、UNIX系OSにはhead、tailという「最初(最後)から数えて◯行分を出力する」というコマンドが存在する。 特にtailは、fオプションと組み合わせてログの監視を行う際に非常に重宝する。

これと同じことをPowerShellで行う場合は、以下のようにする。

1.headコマンドの場合

headコマンドに相当する操作をPowerShell2.0で行う場合は、以下のようにする。

(出力させるコマンド)[0..出力させたい行数-1]

実際に実行した際の例が以下。頭から数えて5行出力させている。

PS C...

Windowsで容量の大きいファイル&ディレクトリを調べる

以前、Linuxで容量の大きいファイル、ディレクトリを調べる方法について記述したので、今回はWindows版。PowerShell、コマンドプロンプトでの調べ方を紹介する。

1.容量の大きいファイルを調べる

Windowsのコマンドプロンプトで容量の大きいファイルを調べる場合、forfilesコマンドを用いると良いだろう。
とは言え、容量の大きいファイルを上から順に何個、というのはコマンドプロンプト上から一行で出力は難しい。そのため、何バイト以上のファイルのみ出力させる方法で確認をする。
以下の例では、1GB以上のファイルのみ出力するように指定している。

forfile...