PowerShellスクリプトをコマンドラインから実行する方法およびその他

新しいPowerShellスクリプト言語に慣れていて、PowerShellスクリプトの実行方法を学びたい場合は、正しいブログ投稿先に来ました。このブログでは、スクリプトを実行する一般的な方法と、発生する可能性のあるいくつかの問題について説明します。

前提条件

この記事では、ローカルコンピューターでPowerShellを実行する方法について説明します。一緒に進めたい場合は、この記事を開始する前に次の前提条件を満たしていることを確認してください。

  • A Windows 10 computer with Administrator privileges.
  • Windows PowerShellバージョン 5以上。また、PowerShell v7も使用できます。このチュートリアルでは、Windows PowerShellに焦点を当てます。なぜなら、Windowsオペレーティングシステムには既に搭載されているからです。
  • 任意のテキストファイルエディタ

実行ポリシーの処理

これがWindows PowerShellスクリプトを実行しようとする最初の試みである場合、一般的な問題に遭遇する可能性があります。PowerShellはおそらく、スクリプトが「このシステムでスクリプトの実行が無効になっているため、ロードできない」というエラーメッセージを返します。

PS> .\GetServices.ps1
 File C:\Temp\GetServices.ps1 cannot be loaded because running scripts is disabled on this system. For more information, see about_Execution_Policies at
 https:/go.microsoft.com/fwlink/?LinkID=135170.
 At line:1 char:1
 .\GetServices.ps1
 ~~~~~ CategoryInfo          : SecurityError: (:) [], PSSecurityException
 FullyQualifiedErrorId : UnauthorizedAccess   

PowerShellは、実行ポリシーがRestrictedRemote Signed、またはAll Signedに設定されている場合に、上記のエラーメッセージを返します。

Restricted

は、Windowsクライアントコンピューターのデフォルトポリシーです。PowerShellを初めて使用する場合、デフォルトのポリシーはおそらくすべてのスクリプトを制限するように設定されています。

ターミナルで個々のコマンドを実行できますが、スクリプトファイルは実行できません。これには、.ps1xml.psm1、または.ps1で終わるすべてのファイルが含まれます。

Unrestricted

Unrestrictedは、任意のスクリプトを実行できますが、インターネットからダウンロードされた場合は実行前に警告が表示されます。このポリシーは通常、Windows以外のデバイスのデフォルトです。

Remote Signed

Remote Signedポリシーでは、(a) デジタルに署名されたスクリプト、または(b) ローカルコンピューターで作成された署名の有無にかかわらず、任意のスクリプトを実行できます。

インターネットからダウンロードされ、署名されていないスクリプトの場合、ファイルをアンブロックする必要があります。ファイル上で右クリックし、プロパティを選択するか、その特定のスクリプトファイルにUnblock-File PowerShellコマンドレットを使用できます。

Remote Signedポリシーを使用するのは、インターネットからダウンロードされたスクリプトを実行する際の理想的なオプションです。

All Signed

All Signedでは、すべてのスクリプトが信頼された発行元によってデジタルに署名されている必要があります。これには、インターネットからダウンロードされたスクリプトとローカルで作成されたスクリプトが含まれます。

PowerShellの実行ポリシーの変更

実行ポリシーを変更するには:

  1. 最高の権限でポリシー変更を行うために、Windows PowerShellを管理者として実行するように開きます。
Search PowerShell in Start Menu

2. PowerShellが開かれたら、以下のPowerShellコマンドを実行してコンピュータの実行ポリシーを設定します。先述の通り、実行ポリシーには3つの異なるタイプがあります。このチュートリアルでは、便利で安全なRemoteSignedの実行ポリシーを使用しています。

このチュートリアルでは、インターネットからGetServices.ps1スクリプトファイルをダウンロードしたことを前提としていますので、実行ポリシーをRemoteSignedに設定してください。

PS> Set-ExecutionPolicy RemoteSigned

RemoteSignedの実行ポリシーは、PowerShellがシステム上で実行する前にインターネットからダウンロードされたすべてのPowerShellスクリプトに対して暗号化署名を強制します。

3. アクションの確認を求められる出力が表示されます。ポリシーの変更を確認するために、Yを入力してEnterキーを押します。

Execution Policy Change
 The execution policy helps protect you from scripts that you do not trust. Changing the execution policy might expose you to the
 security risks described in the about_Execution_Policies help topic at https:/go.microsoft.com/fwlink/?LinkID=135170. Do you want to
 change the execution policy?
 [Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "N"): 

この時点で、次の手順に進んでコンピュータ上でPowerShellスクリプトを実行するさまざまな方法を探索してください。

PowerShellスクリプトの実行方法

PowerShellスクリプトを実行するには、実際には実行するスクリプトファイルが必要です! 手元にない場合は、このZIPファイルをダウンロードして、その中にあるPS1ファイルを展開します。内部にはGetServices.ps1という単純なスクリプトファイルが含まれています。

Write-Output "Listing Computer Services"
Get-Service

すべてのPowerShellスクリプトは、.ps1拡張子で終了する必要があります。

コンソールの使用

スクリプトが準備できたら、PowerShellスクリプトファイルを実行する方法はいくつかあります。最も一般的な方法の1つは、PowerShellコンソールを介してです。

以下の手順で行います:

  1. 上記のようにPowerShellコンソールを開きます。

2. Set-Location PowerShellコマンドレットまたはcdエイリアスを使用して、スクリプトがあるファイルシステムの場所に移動します。このチュートリアルのスクリプトは、C:\Tempディレクトリにあります。

PS> cd C:\Temp\

3. ドット(.)表記を使用してスクリプトを実行します。PowerShellはコマンド名も探します。PowerShellコマンドとスクリプトを区別するには、スクリプトの前にドットを付ける必要があります。このドットは現在のディレクトリを表します。

 PS> .\GetServices.ps1

PowerShellロケーション経由でコマンドラインからPowerShellスクリプトを実行する方法

PowerShellコンソールを介してスクリプトを実行したくない場合、またはできない場合は、古典的なコマンドライン(コマンドプロンプト)でも実行できます。

スクリプトをコマンドプロンプトから実行するには、まずPowerShell実行可能ファイル(powershell.exe)を起動する必要があります。PowerShellの場所はC:\Program Files\WindowsPowerShell\powershell.exeで、スクリプトパスをそのパラメータとして渡します。

PowerShell実行可能ファイルを実行する際には、単に実行中にパラメータを指定することで、任意のコンテキストでパラメータ付きのスクリプトを実行できます。例:powershell.exe -Parameter 'Foo' -Parameter2 'Bar'

cmd.exeを開いた後、以下のようにしてPowerShellスクリプトを実行できます。この例では、エンジンを実行し、スクリプトパスC:\Temp\GetServices.ps1を渡しています。

下記の例では、スクリプトを実行するためにPowerShellの場所パスを使用していることに注意してください。フォルダがどこかのPATHにない場合は、これを行う必要があります。

CMD> C:\Program Files\WindowsPowerShell\powershell.exe "C:\Temp\GetServices.ps1"

PowerShell 7のPowerShell場所は、通常pwsh.exeという別の実行可能ファイルを使用し、場所はC:\Program Files\PowerShell\7\pwsh.exeにあります。

以下は、cmd.exeが実行するバッチファイルを介してスクリプトを実行する方法をカバーする便利なYouTube動画です。

PowerShell ISEの使用

自分のスクリプトを作成したり、他のスクリプトを編集する場合、PowerShell ISEVisual Studio (VS) Codeなどのスクリプトエディタを使用することになるでしょう。ISEはWindowsに付属しているため、このチュートリアルではその方法に焦点を当てています。

ISEを使用してスクリプトを呼び出すには、次の手順に従います。

  1. スタートメニューに移動し、PowerShell ISEを検索して開きます。
Search PowerShell ISE in Start Menu

2. ファイルをクリックし、開くを選択してスクリプトを見つけます。

Open Script using File Menu

3. スクリプトを開いた状態で、実行ボタンをクリックしてスクリプトを実行します。このボタンは、下部にある組み込みのPowerShellターミナルでスクリプトを実行します。

Run Script using PowerShell ISE

サンプルスクリプトの出力

A PowerShell script can sometimes return output. This happens when the script you’re executing is built to return objects which is a fundamental component of PowerShell.

サンプルのGetServices.ps1スクリプトを実行すると、以下の内容が表示されます。このスクリプトは、ローカルのWindowsコンピュータにインストールされているすべてのサービスを返すGet-Serviceコマンドレットを実行します。

PS> .\GetScripts.ps1
Listing Computer Services
Status   Name               DisplayName
------   ----               -----------
Running  aakore             Acronis Agent Core Service
Stopped  AarSvc_1b668d      Agent Activation Runtime_1b668d
Running  AcronisActivePr... Acronis Active Protection Service
Running  AcronisCyberPro... Acronis Cyber Protection Service
Running  AcrSch2Svc         Acronis Scheduler2 Service
Running  AdobeARMservice    Adobe Acrobat Update Service
Running  AdobeUpdateService AdobeUpdateService
Running  AGMService         Adobe Genuine Monitor Service
Running  AGSService         Adobe Genuine Software Integrity Se...
----Truncated----

スクリプト内から別のスクリプトを実行する

たとえば、GetUser.ps1というスクリプトとResetPassword.ps1というスクリプトがあるとします。 GetUser.ps1スクリプト内で、ユーザーパスワードをリセットするためにResetPassword.ps1を実行したい場合は、次のようにします。

呼び出し元のスクリプト(GetUser.ps1)内に、他のスクリプトを呼び出すためのコマンドを追加します。コマンドラインからスクリプトを呼び出す場合と同様です。

以下の例では、いくつかのオプションがあります。通常は、同じセッションまたはスコープ内で他のスクリプトを実行することを選択し、特定の理由がない限り、別のPowerShellセッションでスクリプトを実行する必要はありません。

## 別のスクリプトを新しいセッションで実行するには
powershell.exe .\ResetPassword.ps1
## 同じセッションで他のスクリプトを実行するには
.\ResetPassword.ps1

Source:
https://adamtheautomator.com/run-powershell-script/