Get-Contentで文字コードを指定してファイルを読み込む

JOSMで作成した地物データファイルをPowerShellで読み込もうとしたところエラーになってしまいました。

PS > $a = [xml](Get-Content .\基準点.xml)
値 "System.Object[]" を型 "System.Xml.XmlDocument" に変換できません。エラー: "'<' (16 進数値 0x3C)
は無効な属性文字です。 行 12、位置 5 です。"
発生場所 行:1 文字:11
+ $a = [xml] <<<< (Get-Content .\基準点.xml)
    + CategoryInfo          : NotSpecified: (:) []、RuntimeException
    + FullyQualifiedErrorId : RuntimeException

構造に問題があるのかと思ったけどInternetExplorerなどではエラーなく表示できるので問題ないはず。

xyzzyで「基準点.xml」を開いてみたところ文字コードが「utf8n」となっていました、BOMなしのUTF-8のようです。
BOMがないことによって文字コードの判別に失敗したPowerShellがエラーを起こした模様。

Get-Contentで読み込む際に文字コードを指定できれば解決しそうということで「-Encoding UTF8」を付けて実行してみたところうまく解釈してくれました。

PS > $a = [xml](Get-Content -Encoding UTF8 .\基準点.xml)

Get-HelpしてもGet-Contentに「-Encoding」のオプションなんて出てこなかったような気がするけどこれでイケました。

2014/04/24追記

////ココカラ
日本語ヘルプの入っていないPowerShellだと「-Encoding」のオプションが表示されるようです。
環境によってちょっと異なるようですね。
////ココマデ

2014/04/24さらに追記

////ココカラ
Windows8だと日本語でも「-Encoding」の説明が出てきました。
本文で実行した環境はWindows7だったのでその辺の違いもあるんですかね。
////ココマデ

PowerShellでリモートマシンに接続する

PowerShellでリモート管理できないか探していたらリモートマシンに接続する方法があったので試してみました。
今回勢いで実機でテストしてしまったのは内緒です。

構成は下記のような感じ。

  • サーバー(接続される側):ThinkPadX200 Windows 8.1 Pro Update 1
  • クライアント(接続する側):ThinkPadT420 Windows 7 Enterprise SP1

以下設定メモ

続きを読む

一般ユーザーでタスクスケジュールを組めるようにする

Windows 8.1 Proで管理者権限を持たない一般ユーザーに対し、タスクスケジュールを組みたかったけど、タスクスケジューラからユーザーにタスクスケジュールを組む権限が付与されていないと言われてしまった。

権限を与えるにはWindows Serverなどと同じ様に%SystemRoot%\Tasksディレクトリにアクセス権限を与えれば良いようなので試してみた。

Windows 8.1 Proであれば%SystemRoot%はC:\Windows\System32あたりのはずなので下記のコマンドを管理者権限でコマンドプロンプトPowerShellを使って実行する。

> CACLS C:\Windows\System32\Tasks /E /G %ユーザー名%:C

後はタスクスケジューラを起動して必要なタスクを作成すればOK。

WindowsでVPNの自動再接続を行う

Windowsの起動時に自動的にVPN接続をするという形で起動時に自動的にVPNへ接続できるようにしたわけですが、なぜか1日経つとVPN接続が切れてしまうので再接続を行えるようにしました。
バッチファイルとPowerShellスクリプトとタスクスケジューラを組み合わせてるんですが、なんか簡単な方法ないですかね…。

以下設定メモ

続きを読む

PowerShellで引数を含んだエイリアスを作る

PowerShellで新しい空のファイルを作るにはNew-Itemコマンドを使用して

> New-Item -type file hoge

とするとhogeが作成される。作成されるんだけど毎回コマンドと引数をタイプするのは面倒なのでエイリアスに設定しようとしたけど、Set-Aliasコマンドでは引数を含んだコマンドをエイリアスに設定できないらしい。


できないからと言って毎回コマンドを打つのは面倒だと調べたら関数を作ればよいということにたどり着いた。
早速$profileを編集して関数を作成する。

> notepad $profile
function touch {
   New-Item -type file $args
}

関数名はUnix系で利用しているtouchを使用することにして、内容にNew-Item -type fileを記述。関数の引数を受け取る$argsを渡すことで引数を含んだコマンドを実行できるようにした。
これで

> touch hoge

と打つとhogeが作成されるようになる。


$argsは配列としても振る舞うようなので他の関数を作成するときには気をつけたい。

PowerShellのプロファイルを設定する

PowerShellの起動時に設定しておきたい内容はLinuxなどと同じ様にプロファイルに保存しておけます。
プロファイルの場所は下記のコマンドで確認できます。

> $profile
続きを読む