Skip to main content

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 : フルパス