目次

PowerShellメモ

Powershell サンプルコード集

コマンド

コマンド説明
Get-ChildItemファイル一覧

これだけは覚えよう

powershellを使うなら 「 $_ 」 パイプで渡ってきた個々のオブジェクトを表す

Where-Object { 条件 -or 条件 -and 条件 ...}

「条件」には -match,-notmatch,-like などが使える。もちろん大なり小なりも使える。matchは正規表現なので気を付ける。

Foreach-Object { やりたいこと }

$_を配列に入れたり、$_ = “Hello World”+$_ とかやったり、まあいろいろと。

<なんかコマンドとか> | Format-Table -AutoSize -Wrap

とすると表示が長くて「…」とかって表示される部分が省略されずに全部表示される。

スクリプトファイル「.ps1」が実行できない

初回起動時だと、実行ポリシーの関係でスクリプトファイルが実行できない!

PowerShellを管理者で起動してこうする

Set-ExecutePolicy [権限]
権限メモ
Restricted全てのスクリプトが実行禁止。PowerShellまたはWindows
OSインストール直後のデフォルト設定(Windows Server 2012 R2を除く)
AllSigned署名されているスクリプトのみが実行可能。署名されていないスクリプトは実行禁止
RemoteSignedローカルに保存されているスクリプトは実行可能。
インターネットからダウンロードしたスクリプト(非ローカルのスクリプト)は、署名されているもののみが実行可能。Windows Server 2012 R2では、この設定がデフォルト
Unrestricted全てのスクリプトが実行可能。ただしインターネットからダウンロードしたスクリプトは、
実行するかどうかが確認されるので、ユーザーが明示的に許可した場合のみ実行される
Bypass警告やユーザーへの確認なしに、全てのスクリプトが実行可能

ダブルクリックで実行したい

おなじみbatファイルのようにダブルクリックで実行したいとき。

「ダブルクリックで実行できないやん!」状態が結局こうなった。

 powershell.exe -ExecutionPolicy RemoteSigned -File Test.ps1

というショートカット作成した。

必要に応じて -WindowStyle Hidden これの追加でコンソール非表示。といっても起動時に一瞬表示される。

これだとわざわざ管理者で上記ポリシー変更しなくてもショートカットダブルクリックで実行できるっぽいので

作ったスクリプトを他の人でも実行してもらいやすい。

それ以前に、ps1ダブルクリックで「編集」的な動きに慣れない。。。

パスの指定部分でこける

PowerShellは、ファイル指定時に使うワイルドカードがパワーアップしたらしく、そのひとつに、大括弧 '[  ]' を使うワイルドカード指定方法があるらしい。

これが悲劇の引き金です

この括弧、命名規則的にファイル名に使えます。なので、

 [20150101]大事な書類.txt

こんな名前のファイル名、会社とかだと普通にありそうです。あったらコピーや移動などの処理にひと捻りいるので、面倒くさいことこの上ない。

参考までに:http://kanamiyuki.exblog.jp/9447561

「Start-Process」でプロセス起動させる分には大丈夫な模様。

とりあえずの回避方法として

$str=$str -replace "\[","``["
$str=$str -replace "\]","``]"

クリップボードが使えない

例えばこんなコード

[Windows.Forms.Clipbord]::SetText("FooBar")

実行するときに引数で「-sta」とか付加してSTAモードで起動すると動く。

#起動サンプル
powershell -sta -File sample.ps1

Powershell サンプルコード集

暗号化っぽいこと

ある値の排他的論理和をとり、さらにそれの排他的論理和をとると元に戻る、ということから
暗号・復号を同じ処理を使って処理できるので結構組み入れやすいです。ただし、半角のみ対応です。

#サンプル その1 基本的なもの
[char]'c' -bxor 0

intじゃないとだめって出るけどcharもintといえばintなので。

#サンプル その2
#引数は半角の文字列
function ango($word){
    try{
        $val=""
        
        #bxorで排他論理和取っただけだと数字でしかないので後々扱いづらいので文字列にしる
        $word.ToCharArray() | % { $val = $val + [char]([byte][char]$_ -bxor 1]) }
        
        return $val
    } catch {
        return "#error"
    }
}

-bxor 1 の1は適当に変えてください。シフトするビット数です。これならさくっと組み込んだりできます。
ユーザーがちょっこっとわからなくなる程度ですので、そういう場面では使えると思います。

ランダム

数字・アルファベット大文字・アルファベット小文字から長さ5のランダム文字列を作る

$randList = 
@("1","2","3","4","5","6","7","8","9","0")+
@("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z")+
@("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z")
$rand = "" ; 0..4|%{$rand+=(Get-Random -InputObject $randList)}