What is going on with this article? この連載では、Microsoftが提供している新しいシェル、Windows PowerShellの使い方を解説します。今回は、様々なエラーの取り扱い方法、例外処理について説明します。, この連載では、Microsoftが提供している新しいシェル「Windows Power Shell」の使い方を解説します。今回は、さまざまなエラーの取り扱い方法、例外処理について説明します。, 通常PowerShell上で、あるコマンドを実行してエラーが発生した場合は、コンソールウィンドウにエラーメッセージが表示されます。ここでは、このエラーをファイルに出力することを「リダイレクトする」と呼んでいます。, PowerShellでエラーをファイルにリダイレクトするには、リダイレクト演算子を使用した3つの方法があります。, この演算子は、エラーの内容をファイルに出力します。出力先のファイルが既に存在する場合には上書きをします。, 下記は、dirコマンドで存在しないファイルを指定した場合の例です。(「C:\Work」フォルダに「HOGE.txt」が存在しないものとします), 上記のように、2>演算子の後ろに、エラーメッセージを書き込むファイル名を記述します。, では、Get-Contentコマンドレットを使用して作成された「err.txt」ファイルの中身をみてみましょう。, この演算子は、エラーの出力先のファイルが既に存在する場合は、追記書き込みを行います。, 追記されることを確認するために、出力先のファイルは先ほどと同じ「err.txt」とします。また。異なるエラーメッセージが記述されるようmkdirコマンドに変更しました。, 通常、変数の内容を確認してもメッセージに色がつかないのですが、2>&1演算子を使用して代入された値は、赤色で表示されていることが分かります。, これは、変数に代入された値はエラーであることを示すErrorRecordオブジェクトとなるからです。(Errorオブジェクトは後述します)). Help us understand the problem. なので、 cd <移動先のパス> でフォルダを切り替えることができる。, cd 以外にも、よく使うコマンドレットには、コマンドプロンプトや Unix のシェルなどでよく使われる名前でエイリアスが定義されている。, PowerShell で実行する処理をテキストファイルにまとめておき、スクリプトファイルとして実行することができる。, Windows Server 2012 R2 以外の OS では、デフォルトでスクリプトファイルの実行ができないようにポリシーが設定されている。, ポリシーを変更するには、 Set-ExecutionPolicy というコマンドレットを使用する。 バージョンが上がるにつれ、使いやすさ向上のため機能が追加されていっている。, 自分の環境は Windows7 のデフォルト状態なので、 ver 2 の ISE の使い方をメモする。, ブレークポイントを設定してから F5 で実行すれば、ブレークポイントで処理が停止してくれる。, PowerShell はただ .NET 上で動いるだけでなく、 .NET Framework が提供するクラス郡を利用することができる。, PowerShell を使うことの最大のアドバンテージは、このパイプだと勝手に思っている。, bash などの CLI では、コマンドをパイプでつなぐとテキストデータが次のコマンドに送られる。 ブログを報告する, GitHub風進捗グラフAPIサービスPixelaのReact Nativeアプリを開…, PowerShellをアップデートして「cd -」コマンドで直前のディレクトリに戻れるようにした, Create React Appで作成したアプリにpackage.jsonのバージョン情報を表示する, React Hooksを学ぼうとしたらReactアプリをyarn startで起動できなかった, React NativeアプリでRealmを使うためにNode.jsのバージョンを下げた話とか. [System.IO.Directory]::Exists($pathToDirectory)) Windowsマシンでコマンドを入力する際には基本的にGit BashかConsole 2を使っている。ただ、最近よく利用しているVS CodeのデフォルトはPowerShellなので、これも割とよく使うのだが、古いバージョンを使っていたため「cd -」コマンドが使えず困っていた。, BashなどUnix系のシェルを利用していると、直前のディレクトリに戻る際にcd -というコマンドを利用することができる。, コマンドプロンプト(CMD)では使えないlsなどのコマンドもPowerShellはいい感じに解釈して実行してくれるので、cd -も使えるかなと思ったらエラーが出てしまった。, Google先生に聞くと、なんかStackoverflowっぽいサイトに案内された。, 自分で頑張ってエイリアスを設定すればいいよ、ということらしい。めんどくさ……と思いつつ最後まで読むと素敵な情報が。, Just tried cd - on Powershell Core 6.2.2 and it works :), VS Codeでターミナルを起動すると、pscore6という新しいバージョンを使えという表示が出ている。やはりバージョンアップが必要なようだ。, PowerShellのバージョンを正確に確認する方法をGoogle先生に問い合わせると、こちらのページがヒットした。, get-hostというコマンドを入力すると、PowerShellのバージョンを確認できるらしい。実行してみると、以下のような表示が出た。PowerShellのバージョンとしては「5.1.18362.145」ということになる。, しかし6.2.2で上手くいくと教えてくれたStackoverflowによれば、PowerShellではなくPowerShell Coreと書かれている。, さらっと読んだだけだが、どうやらPowerShellが新しくなってPowerShell Coreができたらしい。MacやLinuxなどのクロスプラットフォーム対応とDockerサポートがある、と。なるほど。, インストール手順は公式サイトを参考にした。OSはWindows 10なので、前提条件は無視できる。, GitHubのリリースページからPowerShell Core 6の最新版(6.2.3)のインストーラ(.msiファイル)をダウンロードする。プレビュー版の7が公開されているが、こちらは一旦無視する。, ダウンロードしたインストーラを利用してインストールする。インストーラの表記がPowerShell Coreになってないのが気になるが、関係なさそうなのでとりあえず先に進む。, 念のためエクスプローラ上で右クリックメニューからPowerShellを開けるようにしておく。, さてこれで安心……と思ってVS Codeを開いてget-hostコマンドでバージョンを確認すると、何も変わっていなかった。調べてみると、こちらは別途設定が必要とのこと。, コマンドプロンプトや、これまで利用していたPowerShellに加えて、WSLやGit Bashも選択することができるようだ。じゃあGit Bashでいいかな……とも思ったが、せっかくPowerShell Coreをインストールしたのでそちらを選択した。, シェルの名前が「powershell」から「pwsh」に変更になっていることを確認。, kidani_aさんは、はてなブログを使っています。あなたもはてなブログをはじめてみませんか?, Powered by Hatena Blog Microsoft Ignite 2020の振り返りも「Azure Rock Star Community Day」, you can read useful information later efficiently. if (! PS C:\Work> Get-Content err.txt Get-ChildItem : パス 'C:\Work\HOGE.txt' が存在しないため検出できませ ん。 発生場所 行:1 文字:4 + dir <<<< HOGE.txt 2>err.txt エラーの内容がリダイレクトされていることが分 … Why not register and get more from Qiita? RemoteSigned を指定した場合、ローカルで作成されたスクリプトは無条件で実行できるが、ネットワークから入手したスクリプトは署名が無ければ実行できない(Windows Server 2012 R2 はこの設定がデフォルト)。, PowerShell には、開発環境として ISE (あいす)というエディタが標準で用意されている。, 入力補完やデバッガ機能が存在するので、 PowerShell のスクリプトを書くときは、基本 ISE を使用することになると思う。, Windows 7 なら「アクセサリ」に、 Windows 8 なら「管理ツール」にそれぞれショートカットが存在する。, ISE も PowerShell のバージョンに合わせて異なるバージョンのものがインストールされている。 掲載記事、写真、イラストの無断転載を禁じます。 PowerShellでパスが存在するかどうかを確認するより良い方法. PowerShellではDOSコマンドが実行できない。 PS D:\test\ps> dir /B /S dir : パス 'D:\B' が存在しないため検出できません。 発生場所 行:1 文字:1 + dir /B /S + ~~~~~~~~~ + CategoryInfo : ObjectNotFound: (D:\B:String) [Get-ChildItem], ItemNotFoundException + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand { パース段階でエラーが起きた場合、スクリプト全体が実行されない。例えば次のスクリプトを実行しようとしたとき、「###Start###」も「###End###」も表示されない。後述の trap ブロックや catch ブロックがあっても実行されない。, デフォルトでは、実行時エラーが起きてもスクリプトの実行が継続する。これは、ErrorAction パラメーターのデフォルト値が Continue であるため。, ErrorAction パラメーターの値を Stop にすると、エラーが起きた時点でスクリプトが停止する。, 「###End###」が表示されなくなった。例外のクラスが RuntimeException から ParentContainsErrorRecordException に変わっているが、なぜかは私にはわからない。, 個々のコマンドレットで発生する実行時エラーに対しては、コマンドレットごとに ErrorAction の値を設定することもできる。, スクリプトの任意の位置に trap ブロックを置くと、エラーが起きたときに、trap ブロックの中身が実行されたのちエラーメッセージが出力される。trap ブロックの中では、エラーの内容を $_ で参照できる。, ErrorAction の値が Continue なので「###End###」が表示されている。trap で捕捉された例外とエラーメッセージに表示される例外が異なるが、なぜかは私にはわからない。, デフォルトでは、つまり ErrorAction の値が Continue の場合、個々のコマンドレットで発生する実行時エラーは捕捉されない。, 個々のコマンドレットでの実行時エラーを捕捉するには、そのコマンドレットで ErrorAction の値を Stop にする。この場合も、スクリプトの実行はエラーが起きた後も継続する。, スクリプト全体で ErrorAction の値を Stop にすると、エラーを捕捉できるだけでなく、エラーが起きたときにスクリプトの実行が止まる。, try ブロックの中で実行時エラーが起きると、処理が catch ブロックに移る。trap と同様、catch ブロックの中でもエラーの内容を $_ で参照できる。ただし、trap と異なり、エラーメッセージは出力されない。, trap と同様、個々のコマンドレットで起きる実行エラーは捕捉されず、エラーメッセージが出力される。, ErrorAction の値を Stop にすると、エラーを捕捉できるようになる。, スクリプト全体で ErrorAction の値を Stop にしていても、try ブロックの中でエラーが起きた場合、catch ブロックの後にあるスクリプトが実行される。, エラーが起きた後にスクリプトの実行を止めたい場合、catch ブロックの末尾に break を置く。, エラーが起きても起きなくても実行するスクリプトがある場合は、finally ブロックに記述する。, PowerShell スクリプトから呼び出した外部ツールでエラーが起きた場合、PowerShell スクリプトではエラーを捕捉できない。try ブロック内で結果を判定して、期待した結果でなければ throw すると、その例外を捕捉できる。外部プロセスの結果は $LastExitCode に書き込まれるので、この値を見て結果を判定できる。具体的な方法は外部ツールによって異なる。, 翻訳会社勤務の翻訳家兼エンジニア。個人のウェブサイトが時代遅れになってしまったので改修中。. 入力補完やデバッガ機能が存在するので、 PowerShell のスクリプトを書くときは、基本 ISE ... パス '(省略)\not exists' が存在しないため検出できません。 ... パス '(省略)\not exists' が存在しないため検出できません。 リアルタイムWebアプリケーション用JavaScriptライブラリ「Socket.IO 3」がリリース, ITエンジニアにおすすめしたい本を決める「ITエンジニア本大賞 2021」の投票受付が開始, フロントエンドWebアプリケーションフレームワーク「Angular 11.0.0」がリリース, PythonでHTMLを解析してデータ収集してみる? スクレイピングが最初からわかる『Python 2年生』, 時系列データベース「InfluxDB 2.0」が一般提供開始、時系列データに特化した言語「Flux」などを追加, スクラムってどんな開発手法? 基本ルールや必要な役割を人気ロングセラーの改訂版から紹介, Kotlin用UIフレームワーク「Jetpack Compose for Desktop」登場、モバイルUIと重要な部分を共有可能に, 「Ubuntu 20.10」がリリース、Raspberry Piによるデスクトップ環境やマイクロクラウド環境の構築が可能に, Python代替実装「Pyston v2」がリリース、Python 3.8よりも20%高速化を実現, VS Code用Python拡張機能に「debugpy 1.0」が搭載、2020年10月リリースより, JavaScript/TypeScriptランタイム「Deno 1.5」がリリース、型チェックを最大15倍効率化, ナラヤン氏も登壇 グローバル向けKeynoteで発表された新製品や新機能を解説[Adobe MAX 2020], 2020年10月にAmazonで売れた「コンピュータ・IT」の本は? ランキング1位から100位まで, 原点は「どんな世の中を作りたいか」――DataSignが懸ける、未来の困りごとを解決するプロダクトづくりとは, オルターブース、.NETアプリケーションのAzureへの移行を体験できるオンラインハンズオンを11月20日に開催, 【11/18開催】丹野瑞紀氏登壇ウェビナー、「PMとしてど振る舞うか?」考えるケーススタディを公開, 開発者向けイベント「オープンデベロッパーズカンファレンス 2020 Online」が12月19日開催, ※旧SEメンバーシップ会員の方は、同じ登録情報(Eメール&パスワード)でログインいただけます。, プログラミングに役立つソースコードと解説記事が満載な開発者のための実装系Webマガジンです。 Tech TIPS:WindowsでPowerShellスクリプトの実行セキュリティポリシーを変更する - @IT, Windows PowerShellコマンド&スクリプティング入門:PowerShellスクリプティングの第一歩(後編) (2/5) - @IT, .net - Prevent ArrayList.Add() from returning the index - Stack Overflow, Windows PowerShell 入門(4)-変数と演算子 (2/3):CodeZine, PowerShell の コマンドレット例外を取得する - tech.guitarrapc.cóm, 例外処理 - Windows PowerShell | ++C++; // 未確認飛行 C, 【Windows PowerShell】スクリプトの途中でスクリプトを強制終了する - Muni Bus, PowerShell的システム管理入門:第2回 PowerShellの基礎 (1/3) - @IT, PowerShell で 関数実行結果の型をパイプラインの先に伝搬する - tech.guitarrapc.cóm, [PS1] Powershell の基本 (3:パイプライン処理) | オールトの雲, (PowerShell) パイプラインはProcessで - Code Aquarium, How to export data to CSV in PowerShell? - Stack Overflow, PowerShellらしい関数の書き方 [PS Advent Calendar '12] - PowerShell Scripting Weblog, Windows PowerShell 活用編(7) XMLデータの基本操作1 (1/4):CodeZine, 変数などは全て .NET のオブジェクトなので、普通に .NET の API が使用できる(PowerShell の強みの1つ)。, 文字列リテラルは、ダブルクォーテーションまたはシングルクォーテーションで定義する。, ダブルクォーテーションの場合は、変数の展開が行われる。シングルクォーテーションの場合は展開が行われない。, 関数外部で宣言されているものと同名の変数を関数内部で上書きしても、関数外部からは関数内部で代入した値を参照できない。, スローできるオブジェクトは、「文字列」「.NET Framework の例外クラス」「, you can read useful information later efficiently.