PowerShell メモ - 未分類
ソースに日本語を使う場合
UTF-8 BOMありで保存する必要あり- でないと .NET に渡す際などに、文字化けする
複数行コメント
ps1
<#
ここはコメントです。
2行目。
#>
ローカル スコープ
bash と同じような動き方をする
こう書いたとして、
a.ps1
$x += 1
Write-Host $x
実行するとファイル内で閉じたスコープ
.\a.ps1 # 1
.\a.ps1 # 1
.\a.ps1 # 1
. で load すると、呼び元のセッションで評価される
. a.ps1 # 1
. a.ps1 # 2
. a.ps1 # 3
グローバル スコープ
セッションの変数、という意味になる。
a.ps1
$global:x += 1
Write-Host $global:x
こう動く
.\a.ps1 # 1
.\a.ps1 # 2
.\a.ps1 # 3
呼び元のセッションと切り離したい
- global 変数や、Add-Type したものはセッションで保持されてしまう
- これは動作確認する際に都合が悪い
- 前の実行の影響を受けずにPowerShellスクリプトの動作確認をするには、powershell コマンド経由で呼ぶと良い
a.ps1
$global:x += 1
Write-Host $global:x
こうすれば、呼び元のセッションには影響しない
powershell a.ps1 # 1
powershell a.ps1 # 1
powershell a.ps1 # 1
typeof 的なもの
ps1
Write-Host ($x).GetType()
ダブルクリックだけで実行させたい
悩み
ps1ファイルのままだと、実行の仕方が人それぞれになりそう- コマンドプロンプトから
powershell a.ps1 - PowerShell のプロンプトから
.\a.ps1 - 右クリックから、
- コマンドプロンプトから
- でも、GUI アプリにしたい場合、コマンドプロンプトは邪魔
対応内容
- VBScript から呼び出す
- その際、ExecutePolicy, WindowStyle を指定する
vbs
Set fso = CreateObject("Scripting.FileSystemObject")
Set shell = CreateObject("WScript.Shell")
ps1Path = fso.GetParentFolderName(WScript.ScriptFullName) & "\launchan.ps1"
shell.Run "powershell.exe -ExecutionPolicy Bypass -WindowStyle Hidden -File """ & ps1Path & """", 0, False
制限と方針
- VBScript から呼び出し時に 出力を 握りつぶしているので、Write-Host 結果は受け取れない
- そのため、ps1 ファイル内で完結して、エラーの場合は ダイアログなりログなりに出すといった対応にする必要あり
ディレクトリ直下のファイル一覧取得と、ファイル オブジェクト
ps1
$csvDir = Join-Path $PSScriptRoot "samples"
$csvFiles = Get-ChildItem -Path $csvDir -Filter *.csv
foreach ($csvFile in $csvFiles) {
Write-Host $csvFile.Name
}
- System.IO.FileInfo
- Name : ファイル名
- BaseName : 拡張子なしの名前
- Extension : 拡張子(ドットつき)
- FullName : フルパス
以下広告