====== PowerShellメモ ======
[[psh_sample_code]]
=====コマンド=====
^コマンド^説明^
|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
[[psh_sample_code]]
===== 暗号化っぽいこと =====
ある値の排他的論理和をとり、さらにそれの排他的論理和をとると元に戻る、ということから \\
暗号・復号を同じ処理を使って処理できるので結構組み入れやすいです。ただし、半角のみ対応です。
#サンプル その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)}