PowerShellスクリプトの基本
ls が使えたりする♪
Windows PowerShell
Copyright (C) 2006 Microsoft Corporation. All rights reserved.
PS C:\Documents and Settings\Owner> pwd
Path
----
C:\Documents and Settings\Owner
PS C:\Documents and Settings\Owner>
PS C:\Documents and Settings\Owner> cd d:\wsh
PS D:\wsh> ls
ディレクトリ: Microsoft.PowerShell.Core\FileSystem::D:\wsh
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2009/05/08 16:44 1693 FileConvert.ps1
-a--- 2009/05/08 15:17 1412 kconv.wsf
実行に関する注意1―PowerShellはカレント・フォルダを検索しない
PS D:\wsh> FileConvert.ps1
用語 'FileConvert.ps1' は、コマンドレット、関数、操作可能なプログラム、またはスクリプト ファイルとして認識されません。
用語を確認し、再試行してください。
発生場所 行:1 文字:15
+ FileConvert.ps1 <<<<
このように、エラーとなり、ファイル名が認識されていないことが確認できる。結論からいってしまうと、PowerShellではスクリプト・ファイルを実行する場合に必ず絶対パスか相対パス形式でファイルを指定しなければならない。つまり上の例であれば、
PS D:\wsh> ./FileConvert.ps1
PS D:\wsh> D:\wsh\FileConvert.ps1
相対パスか絶対パスで指定する!!
実行に関する注意2―スクリプト実行ポリシーを設定すること
もっとも、これだけではまだ「.ps1」ファイルを実行することはできない。絶対パス/相対パスを指定して再び実行してみると、先ほどとはまた異なるエラーメッセージに遭遇することになるはずだ。具体的なメッセージは以下のとおりである。
PS D:\wsh> ./FileConvert.ps1
スクリプトの実行がシステムで無効になっているため、ファイル D:\wsh\FileConvert.ps1 を読み込めません。詳細については、「g
et-help about_signing」と入力してヘルプを参照してください。
発生場所 行:1 文字:17
+ ./FileConvert.ps1 <<<<
PowerShellではセキュリティ上の理由から、デフォルトでスクリプトの実行が無効に設定されている。そのため、スクリプト・ファイルを実行するためには、あらかじめPowerShellのスクリプト実行ポリシーを変更しておく必要がある。実行ポリシーを変更するにはSet- ExecutionPolicyコマンドレットを利用する。
PS D:\wsh> Set-ExecutionPolicy RemoteSigned
PS D:\wsh> ./FileConvert.ps1
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 2009/05/08 16:54 lang
d---- 2009/05/08 16:54 paradox
d---- 2009/05/08 16:54 ps
d---- 2009/05/08 16:54 sqlite
PS D:\wsh>
Set-ExecutionPolicyコマンドレットで指定可能な実行ポリシーには以下のようなものがある。
実行ポリシー 概要
Restricted すべてのスクリプトを実行不可
AllSigned すべてのスクリプトに証明書を要求
RemoteSigned インターネット経由でダウンロードしたスクリプトのみ証明書を要求
Unrestricted すべてのスクリプト実行を許可(ただしインターネット経由でダウンロードしたコードは実行確認のみあり)
PowerShellで利用可能な実行ポリシー
通常、スクリプトを開発/実行する環境においては、実行ポリシーとして「RemoteSigned」を選択しておくことをお勧めする。「AllSigned」がより安全ではあるが、すべてのスクリプトに証明書が必要となるため、特に自分でスクリプトを開発するような局面では適切とはいえない。「Unrestricted」は名前のとおり、一切の制約を課さない実行ポリシーであり、すべてのスクリプトを無条件に実行することができる。通常、特別な理由がない限りはUnrestrictedの利用は避けるべきだ。
#FileConvert.ps1
# スクリプト・ファイルのパラメータを宣言(先頭から「変換対象のフォルダ」
# 「変換後のファイルの保存先」「変換前の文字コード」「変換後の文字コード」)
param(
[String]$in = "d:\wsh\xampp",
[String]$out = "d:\wsh\xampppp",
[String]$from = "Shift-JIS",
[String]$to = "UTF-8"
)
# 引数$from、$toから、文字コードを表すEncodingオブジェクトを生成
$enc_f = [Text.Encoding]::GetEncoding($from)
$enc_t = [Text.Encoding]::GetEncoding($to)
# 与えられたパス(c:\tmp\convert)から合致するファイルリストを再帰的に取得
Get-ChildItem $in -recurse |
# 取得したファイルを順番に処理
ForEach-Object {
# 取得したオブジェクトがファイルの場合のみ処理(フォルダの場合はスキップ)
if($_.GetType().Name -eq "FileInfo"){
# 変換元ファイルをStreamReaderオブジェクトで読み込み
$reader = New-Object IO.StreamReader($_.FullName, $enc_f)
# 保存先のパス、保存先の親フォルダのパスを生成
$o_path = $_.FullName.ToLower().Replace($in.ToLower(), $out)
$o_folder = Split-Path $o_path -parent
# 保存先のフォルダが存在しない場合にフォルダを自動生成
if(!(Test-Path $o_folder)){
[Void][IO.Directory]::CreateDirectory($o_folder)
}
# 保存先ファイルをStreamWriterオブジェクトでオープン
$writer = New-Object IO.StreamWriter($o_path, $false, $enc_t)
# 変換元ファイルを順に読み込み、保存先ファイルに書き込み
while(!$reader.EndOfStream){$writer.WriteLine($reader.ReadLine())}
# ファイルをすべてクローズ
$reader.Close()
$writer.Close()
}
}



No User Commented In This Post
Leave A Reply.....