これまでの記事

対象読者

  • Windows PowerShellでコマンドレット操作ができる方(基礎編に書いてある程度のことが理解できていること)
  • 何らかのプログラミング経験があればなお良い

必要環境

  • Windows PowerShell

スクリプトの直接入力

 PowerShellにおけるスクリプトは、コマンドレット、変数、パイプ、ifやforといった制御構文を組み合わせて使用します。

 では、まず簡単なスクリプトをコンソールウィンドウに直接書いてみましょう。

 Windows PowerShellを起動し、下記コードを入力してください。下記コードの最後の}を入力したら[Enter]キーを2回押します。スクリプトの入力が完了し、結果が表示されます(コンソールウィンドウ上でスクリプトを記述している間は1番左側に>>が表示されます。このとき[Enter]キーを2回続けて入力すると、スクリプトの入力を完了し、そこまで書いていたコードを実行します。途中で入力を間違えた場合は[Ctrl]キー+[C]キーで中断することができます)。

PS C:\Work> if ( Test-Path "Test.txt" )
>> {
>> Write-Host "Test.txtは存在します"
>> }
>> else
>> {
>> Write-Host "Test.txtは存在しません"
>> }
>>
 

 このコードは、カレントディレクトリに対してTest.txt というファイルの存在を確認し、存在した時と存在しない時とで表示するメッセージを変えています。

 少し補足説明をします。まずifですが、

if (条件式)
{
}

 のように記述します。

 ifは( )の中に記述した条件式が満たされると、すぐ下の{から}までに書かれたコードを実行します。条件を満たさなかった場合はelseを実行します。

    • Test-Pathコマンドレット
指定したファイルが存在する場合はTRUEを返します
    • Write-Hostコマンドレット
コンソールウィンドウに文字列を出力します

 よって今入力したスクリプトは、カレントディレクトリに「Test.txt」ファイルが存在すれば、「Test.txtは存在します」という文字列を、ファイルが存在しなければ「Test.txtは存在しません」という文字列を表示します。

 このようにPowerShellでは、コンソールウィンドウ上で直接スクリプトを実行することが可能です。しかし決まり切ったスクリプトなどは、毎回コンソールウィンドウで入力するのは面倒です。PowerShellでは、スクリプトをファイルに保存して何度でも利用できるように設計されています。

 では、スクリプトファイルはどのように作成したらいいのでしょうか。

スクリプトファイルの作成

 PowerShellにおけるスクリプトファイルは、拡張子が「.ps1」のテキストファイルです。テキストファイルなので、メモ帳などのテキストエディタで作成することが可能です。

 では、先ほどのコードをテキストエディタで入力し、「sample1.ps1」と名前を付けて保存しましょう(可能であれば「C:\Work」というフォルダを作成し、ここへ保存してください。以降このフォルダを使用して説明します。任意のフォルダへ保存する場合は適宜読み替えてください)。

sample1.ps1
if ( Test-Path “Test.txt” )
{
Write-Host "Test.txtは存在します"
}
else
{
Write-Host "Test.txtは存在しません"
}

スクリプトファイルの実行とセキュリティ

 従来のスクリプティング環境のほとんどは、作成したスクリプトファイルをダブルクリックで実行することができました。しかしPowerShellでは、ダブルクリックでは実行されないように設計されています。これは簡単に実行できることで悪意のあるスクリプトファイルから身を守ることができるようへの配慮からです。

 ためしに「sample1.ps1」をダブルクリックしてみてください。メモ帳で「sample1.ps1」が開かれるのではないでしょうか? スクリプトに使用される「.ps1」という拡張子がPowerShellに関連づけられていないため、このような動作になります。

 PowerShellでは、スクリプトファイルは明示的に実行する必要があります。

 まずはコンソールウィンドウで、

cd C:\Work

 と入力し、ディレクトリを移動します。次に、

sample1.ps1

 と入力し[Enter]キーを押してみてください。

 

 まだエラーが発生してしまいます。このように実際にはスクリプトファイル名を入力するだけでは不十分です。PowerShellでは、スクリプトファイルの実行は絶対パスで指定するか、カレントディレクトリのファイルの場合は先頭に./を付けて実行します。

 では、なぜこんな面倒くさいことをしなければならないのでしょうか? 実はスクリプトの実行は拡張子を省略して入力できるのですが、拡張子を省略すると、既存のコマンドレットと同名のファイル名を付けた場合には、自作のスクリプトと既存のコマンドレットの区別ができなくなってしまいます。これはコマンドの乗っ取りと呼ばれます。

 例えば「Get-Command.ps1」という名前のファイルがあったとします。これを、

Get-Command[Enter]

 で実行可能だとしたらどうでしょう?

 既存のGet-Commandコマンドレットとの区別がつかなくなりますし、ましてやこのスクリプトがファイルを勝手に削除してしまうようなスクリプトだとしたら大変です。

 このような背景から、PowerShellでのスクリプト実行は絶対パス、またはカレントディレクトリのファイルの先頭に./を付けて実行する仕組みとなっています。

 これで、スクリプトの実行方法についてはわかりました。しかし、このままでは実行できません。PowerShellは、既定ではスクリプトの実行が許されていないからです。

 コンソールウィンドウに、

Get-ExecutionPolicy

 と入力し[Enter]キーを押してください。Restrictedと返ってきたのではないでしょうか? このコマンドレットは現在の実行ポリシーの設定を確認することができます。

 実行ポリシーには以下の4つがあります。

実行ポリシー
実行ポリシー 説明
Restricted すべてスクリプトの実行を禁止
AllSigned すべてのスクリプトに証明書を要求
RemoteSigned インターネットからダウロードしたスクリプトに証明書を要求
Unrestricted すべてのスクリプトの実行を許可

 現段階では、自分のPCにあるスクリプトファイルが実行できれば良いので、実行ポリシーをRemoteSignedに設定しましょう。Set-ExecutionPolicyコマンドレットで実行ポリシーを変更することができます(OSがWindows Vistaの方は、Windows PowerShellを管理者として実行していないとこのコマンドレットを使用することができないので注意してください)。

Set-ExecutionPolicy RemoteSigned

 と入力し[Enter]キーを押してください。これでやっとスクリプトファイルを実行できるようになりました。

 では、「sample.ps1」を実行してみましょう。コンソールウィンドウで、

./sample1.ps1

 と入力し[Enter]キーを押してください。

 「C:\WorkにTest.txt」が存在すれば「Test.txtは存在します」を、存在しなければ「Test.txtは存在しません」と表示されるはずです(Test.txtを作成したり、削除したりして動作を確認してみてください)。

 
 
 

スクリプトファイルのエラー修正

 残念ながら、先ほどのスクリプトを実行した結果、赤字でメッセージが表示されてしまった方もいるのではないでしょうか? これは、作成したスクリプトファイルにエラーがあることを示しています。

 試しにわざとif文の最初の{ ~ }までのWrite-HostをWrite-Hos(Hostのtを削除して)と書き換えて実行してみましょう(実験する場合Test.txtを準備してから行ってください)。

エラーを発生させるために書き換えた sample1.ps1
if ( Test-Path "Test.txt" )
{
Write-Hos "Test.txtは存在します"
}
else
{
Write-Host "Test.txtは存在しません"
}

 この状態で実行してみると下記のようになるかと思います。

 

 これはどういう意味でしょうか? 1つ1つ説明したいと思います。

用語 'Write-Hos'は、コマンドレット、関数、操作可能なプログム、
またはスクリプト ファイルとして認識されません。用語を確認し、
再試行してください。

 これはまさしく書いてあるとおりで、Write-Hosというものがない(認識できない)ことを意味しています。

発生場所 C:\Work\sample1.ps1:3 文字:12
+ Write-Hos <<<< "Test.txtが見つかりました"

 これはエラーが発生した場所(ファイル)を示しています。今回実行したファイルは「C:\Work」に作成した「sample1.ps1」というファイルを実行してエラーが発生したので、「C:\Work\sample1.ps1」となっています。そのとなりの3 文字:12は3行目の12文字目がおかしいということを意味しています。

 このように、メッセージからエラー箇所を特定し修正を行います。

スクリプトファイルへ値を渡す

 PowerShellでは外部からスクリプトファイルへ値を渡すことが可能です。ためしに下記をテキストエディタで入力し、「sample2.ps1」として保存してください。

sample2.ps1
Write-Host $args[0]

 このコードについて説明します。

 まずWrite-Hostコマンドレットですが、これはWrite-Hostの右側に書かれたものをコンソールウィンドウへ表示します。

 次に$argsですが、これは自動変数と呼ばれている変数で、外部から受け取った値はこの変数に代入されることが決まっています(この変数はPowerShellで予約済みの変数のため、この名前で変数を作成することはできません)。

 $argsは配列変数となっており、いくつでも外部から値を受け取ることができます。各値へのアクセスは$argsの後ろに[]を付け、[]の中には数値を書きます。この数値は要素番号と呼ばれており、1番目に受け取った値は$args[0]、2番目に受け取った値は$args[1]、n番目に受け取った値は$args[n-1]でアクセスできます。

 よって「sample2.ps1は外部から受け取った値の1つ目($args[0]に代入されている)を Write-Hostコマンドレットでコンソールウィンドウに表示せよ」ということになります。

 では、コンソールウィンドウで、

./sample2.ps1 "A"

 と入力し[Enter]キーを押してください。実行結果は下記のようになります。

 

 これは、スクリプトファイル「sample2.ps1」実行時に「A」という文字を渡しています。 渡された値は$args変数に代入されているので、結果としてコンソールウィンドウに「A」という文字が表示されます。

スクリプトの実行結果を変数に代入する

 最後に、スクリプトファイルの実行結果を変数に代入する方法について説明します。まずは下記コードをテキストエディタで入力して「tashizan.ps1」として保存してください。

tashizan.ps1
return $args[0] + $args[1]

 tashizan.ps1では外部から受け取った2つの値を加算してreturnで返します(returnを使用することで値を返すことができます)。

 スクリプトファイルの実行結果を変数に代入するには、コンソールウィンドウで、

$result = ./tashizan.ps1 2 3

 のようにします。

 この場合は、「2」と「3」がtashizan.ps1に渡され、$args[0] + $args[1]で2つの値を加算し、加算した結果をreturnで返します。返された結果は、$result変数に代入されます。

 コンソールウィンドウで

$result

 と入力し[Enter]キーを押してみてください。代入された計算結果の「5」が出力されるはずです。

まとめ

 今回は、

  • スクリプトファイルの作成方法
  • スクリプト実行とセキュリティー
  • スクリプトのエラー修正
  • スクリプトファイルへの値の渡し方と受け取り方

 について説明しました。今回説明したことはほんの入り口にすぎないため、十分理解して次のステップへとつなげてもらえればと思います。

 次回は、スクリプトファイルを作成する上で欠かせない変数や演算子、制御構文について説明したいと思います。

Windows PowerShell 入門(3)-スクリプト編的更多相关文章

  1. Windows PowerShell 入門(7)-関数編2

    この連載では.Microsoftが提供している新しいシェル.Windows Power Shellの使い方を解説します.前回に引き続きPowerShellにおける関数の取り扱いとして.変数と関数のスコ ...

  2. Windows PowerShell 入門(2)-基本操作編 2

    前回に引き続きMicrosoftが提供している新しいシェル.Windows Power Shellの基本操作方法を学びます.基本操作編第2弾の今回は.パイプの使用方法を中心としたコマンドレットの操作方 ...

  3. Windows PowerShell 入門(10)-デバッグ編

    対象読者 Windows PowerShellでコマンドレット操作ができる方 何らかのプログラミング経験があればなお良い 必要環境 Windows PowerShell デバッグメッセージの出力 Po ...

  4. Windows PowerShell 入門(9)-エラー編

    対象読者 Windows PowerShellでコマンドレット操作ができる方 何らかのプログラミング経験があればなお良い 必要環境 Windows PowerShell エラーをリダイレクトする リダ ...

  5. Windows PowerShell 入門(8)-関数編3

    この連載では.Microsoftが提供している新しいシェル.Windows PowerShellの使い方を解説します.今回は.フィルタ.スクリプトブロック.変数のスコープについて取り上げます. はじめ ...

  6. Windows PowerShell 入門(6)-関数編1

    この連載では.Microsoftが提供している新しいシェル.Windows Power Shellの使い方を解説します.今回は.関数の作成基礎と引数.戻り値.Switchパラメータについて説明します. ...

  7. Windows PowerShell 入門(1)-基本操作編

    Microsoftが提供している新しいシェル.Windows Power Shellの基本操作方法を学びます.インストール.起動終了方法.コマンドレット.命名規則.エイリアス.操作方法の調べ方について ...

  8. Windows PowerShell 入門(4)-変数と演算子

    Windows PowerShellにおける変数と演算子の使用方法について学びます.今回は代表的な演算子として.算術演算子.代入演算子.論理演算子.比較演算子.範囲演算子.置換演算子.ビット演算子.型 ...

  9. Windows PowerShell 入門(5)-制御構文

    Windows PowerShellにおける制御構文について学びます.数ある制御構文の中でもSwitch文は.他の言語に比べ豊富な機能が用意されています. 対象読者 Windows PowerShel ...

随机推荐

  1. OS + RedHat 6.3 x64 NFS / mount.nfs: access denied by server while mounting

    s Linux mount/unmount命令(转) https://www.cnblogs.com/xd502djj/p/3809375.html 问题2:NFS配置项no_root_squash和 ...

  2. 网络编程基础【day10】:操作系统介绍

    一.为什么要有操作系统 现代的计算机系统主要是由一个或者多个处理器,主存,硬盘,键盘,鼠标,显示器,打印机,网络接口及其他输入输出设备组成. 一般而言,现代计算机系统是一个复杂的系统. 其一:如果每位 ...

  3. 面向对象【day08】:动态导入模块(八)

    本节内容 1.概述 2.知识回顾 3.动态导入模块 一.概述 我们之前导入模块都是用import,或者from ... import ....这种模式去导入模块,那如果我们如何实现只用字符串就可以导入 ...

  4. 微服务之consul

    一.概述 consul是google开源的一个使用go语言开发的服务发现.配置管理中心服务.内置了服务注册与发现框 架.分布一致性协议实现.健康检查.Key/Value存储.多数据中心方案,不再需要依 ...

  5. KMP算法的next[]数组 的求法

    例如: next数组的求解方法是:第一位的next值为0,第二位的next值为1,后面求解每一位的next值时,根据前一位进行比较.首先将前一位与其next值对应的内容进行比较,如果相等,则该位的ne ...

  6. idea使用maven打包项目

    第一步:打开maven Projects 第二步.找到package 第三步,运行.到路径下面去找打包的文件吧. 第二种方法: 使用命令 cmd进入项目目录,例如项目在D盘项目名poject 输入: ...

  7. golang goroutine

    goroutine-介绍 1)进程就是程序程序在操作系统中的一次执行过程,是系统进行资源分配和调度的基本单位2)线程是进程的一个执行实例,是程序执行的最小单元,它是比进程更小的能独立运行的基本单位.3 ...

  8. hdu 6441 (费马大定理+勾股数 数学)

    题意是给定 n 和 a,问是否存在正整数 b,c 满足:a^n + b^n == c^n.输出 b  c,若不存在满足条件的 b,c,输出 -1 -1. 当 n > 2 时,由费马大定理,不存在 ...

  9. MyBatis SQL语句操作Mysql

    本文记录使用Mybatis操作数据库时碰到的一些语句,供以后参考. 一,多条件查询 示意SQL语句:SELECT t_field1, t_field2 FROM table_name WHERE t_ ...

  10. CountDownLatch学习

    看了几篇博客,说用CountDownLatch实现一个先执行完子线程,再执行主线程的例子.因此写一篇博客总结一下. 一.CountDownLatch了解 1.CountDownLatch继承了Abst ...