.ps1ファイルをダブルクリックしてPowerShellスクリプトを機能させる方法はありますか?


139

私はチームにPowerShellスクリプトを配布しています。スクリプトは、VsphereクライアントからIPアドレスを取得し、mstsc接続を作成して、共有ファイルに記録します。

彼らがスクリプトを使用した瞬間、彼らはマシンのIPアドレスを知るようになりました。その後、PowerShellスクリプトを実行するのではなく、常に直接mstscを使用する傾向があります。(mstscを使用しているため、VMを頻繁に使用しているかどうかはわかりません。)

主に彼らは、PowerShellの実行は簡単ではないと私に言っています。

私は彼らの怠惰にうんざりしています。

.ps1ファイルをダブルクリックしてPowerShellスクリプトを機能させる方法はありますか?


3
サーバーでログを使用するのはどうですか?「ユーザーを信頼しない」とは、データでユーザーを信頼できないことを意味しますが、多くの場合、ユーザーが怠惰ではないと信頼しないことを意味します。



私はそれをvscodeで実行することを好みます(そのため、コンソールを表示してデバッグできます)
JinSnow

回答:


132

「ターゲット」として次のようなショートカットを作成します。

powershell.exe -command "& 'C:\A path with spaces\MyScript.ps1' -MyArguments blah"

3
Jeffery Hicks(彼はpowershellの権威あるリソースです)が設定を変更することは推奨されていないとアドバイスしているので、私はあなたの答えをベストアンサー、JPBlancの答えを有用な答えとして投票します。
Samselvaprabu

6
これを次のように使用します。 `-noLogo -ExecutionPolicy unrestricted -file <path>` as Answered by:@ user3071883
Ujjwal Singh

1
@UjjwalSingh:スクリプトが予期し-NoProfileないあらゆる種類のことをプロファイルが実行できるため、これも役立ちます。
ジョーイ

5
今後の読者のために:以下の回答には、OPが要求したことを実行するレジストリハックがあります。受け入れられた答えはしません。
Wouter 2017

2
これを行う方法はありますが、相対/現在のパスを使用していますか?
mythofechelon

78

または、すべてのPS1ファイルをVBSファイルと同じように機能させたい場合は、次のようにレジストリを編集できます。

HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\open\command

デフォルト値を次のように編集します...

"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -noLogo -ExecutionPolicy unrestricted -file "%1"

次に、必要なすべての.PS1ファイルをダブルクリックします。私の控えめな意見では、箱から出してできるようになります。

これを「Powershell De-castration Hack」と呼びます。笑お楽しみください!


26
これは、この答えのリストで私のために働いた唯一のものです。「お勧めできません」という答えを受け入れる準備ができていません-PCに何をすべきかを指示しますが、PCは指示しません。
マット

7
これは実際にはダブルバイパスです。ダブルクリック・ツー・ランに対する制限を削除し、かつさえコンソールから信頼されていないスクリプトを実行している防ぐために意図されたのPowerShellのExecutionPolicyの周りになります。
Iszi 2014年

4
これは間違った方法です。デフォルトとして「PowerShellで実行」を設定する代わりに、「開く」コマンドの動作を変更します。以下のitgala.xyzの回答を参照してください。
Indy411

4
この方法を使用する場合、レジストリキーの正しいデフォルト値は、実際"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -NoLogo -File "%1"%*にはオプションでを含めることができる場所です-ExecutionPolicy unrestricted。コマンドの最後の変更に注意してください。これにより、0個以上のパラメーターをPowerShellスクリプトに渡すことができます。引用符とパーセント記号の周りの間隔は、示されているとおりにする必要があります。
Glenn Slayden 2016年

2
レジストリを編集するのではなく、コマンドラインソリューションの場合はftype Microsoft.PowerShellScript.1=^"^%SystemRoot^%\System32\WindowsPowerShell\v1.0\powershell.exe^" -NoLogo -ExecutionPolicy Unrestricted -File ^"%1^" %*、同じことを実行するように入力できます。
Damian T.

21

PowerShellのセキュリティ機能の1つは、ユーザーがダブルクリックでスクリプトを起動できないことです。この設定を変更する場合は十分に注意してください。別の方法として、スクリプトをパッケージ化することもできます。PrimalScriptのような一部のエディターはそれを行うことができます。ユーザーは引き続きPowerShellをインストールする必要がありますが、exeをダブルクリックできます。そして、あなたのチームは少しの教育を必要としているようです。


3
これは、ハッカーが別の方法を見つけるまで少なくとも数分遅れるので、セキュリティ機能です。
MarcH 2016年

23
それは愚かで役に立たないセキュリティ機能です。それをダブルクリックしてバッチを実行できますか?はい、exe?はい。VBScript?はい。なぜpoweshellスクリプトが他のスクリプトよりも危険であると考えられるのか理解できません
Mauro F.

12
私はあなたたちについては知りませんが、誤ってダブルクリックして以前に間違いなく間違ったコンピューターでbatファイルを実行しました。管理を自動化するためのものはあり、それを制限することは完全に理にかなっています。
ロードチート2017

1
EXEファイルをダブルクリックすると、これがどのように役立つかわかりません。しかし確かに、Powershellチームはこの基本的な議論を認識しています。それ以上のものがあるに違いありません。
usr

1
実行するのが「危険」なスクリプトを記述し、基本的な確認プロセスを追加しない場合...私は危険に生きるのが好きだと思います。
ロメインヴィンセント

18

これは私にとってWindows 10とpowershell 5.1で機能しました:

  • .ps1ファイルを右クリック
  • で開く...
  • 別のアプリを選択
  • powershell.exeの場所をアドレスバーにコピーします(デフォルトでは、Windowsフォルダーは表示されません)。つまり、C:\ Windows \ System32 \ WindowsPowerShell \ v1.0
  • powershell.exeを選択します
  • 「常にこのアプリを使用して.ps1ファイルを開く」を選択します
  • OKをクリック

2
おそらく、ホストマシンの実行ポリシーを妥当なもの、つまりRemoteSignedに設定する必要があります
vizmi

4
これは数年前のもので、半年前まで誰もこれについて考えていませんでしたか?-私もこれを実行しましたが、完全に機能しますが、さらに構成を行う必要があります。そうしないと、Powershellが.ps1スクリプトをまったく実行できなくなります(を参照Set-ExecutionPolicy)。
DarkWiiPlayer

これを機能させるには、スクリプト名にスペースを含める必要がないようです。それ以外は完全に動作するようです。
ルーク、

2
これが最高投票の回答ではないのはなぜですか?ファイルの関連付けを介して、Windowsが意図したとおりにレジストリを編集できるのに、なぜバッチファイルを使用するのでしょうか。
キッカス博士

Dr.Kickass @それはおそらく私が推測する新しい答えの一つです
vizmi

17

私はこれを数年前に書きました(管理者権限で実行してください):

<#
.SYNOPSIS
    Change the registry key in order that double-clicking on a file with .PS1 extension
    start its execution with PowerShell.
.DESCRIPTION
    This operation bring (partly) .PS1 files to the level of .VBS as far as execution
    through Explorer.exe is concern.
    This operation is not advised by Microsoft.
.NOTES
    File Name   : ModifyExplorer.ps1
    Author      : J.P. Blanc - jean-paul_blanc@silogix-fr.com
    Prerequisite: PowerShell V2 on Vista and later versions.
    Copyright 2010 - Jean Paul Blanc/Silogix
.LINK
    Script posted on:
    http://www.silogix.fr
.EXAMPLE
    PS C:\silogix> Set-PowAsDefault -On
    Call Powershell for .PS1 files.
    Done!
.EXAMPLE
    PS C:\silogix> Set-PowAsDefault
    Tries to go back
    Done!
#>
function Set-PowAsDefault
{
  [CmdletBinding()]
  Param
  (
    [Parameter(mandatory=$false, ValueFromPipeline=$false)]
    [Alias("Active")]
    [switch]
    [bool]$On
  )

  begin
  {
    if ($On.IsPresent)
    {
      Write-Host "Call PowerShell for .PS1 files."
    }
    else
    {
      Write-Host "Try to go back."
    }
  }

  Process
  {
    # Text Menu
    [string]$TexteMenu = "Go inside PowerShell"

    # Text of the program to create
    [string] $TexteCommande = "%systemroot%\system32\WindowsPowerShell\v1.0\powershell.exe -Command ""&'%1'"""

    # Key to create
    [String] $clefAModifier = "HKLM:\SOFTWARE\Classes\Microsoft.PowerShellScript.1\Shell\Open\Command"

    try
    {
      $oldCmdKey = $null
      $oldCmdKey = Get-Item $clefAModifier -ErrorAction SilentlyContinue
      $oldCmdValue = $oldCmdKey.getvalue("")

      if ($oldCmdValue -ne $null)
      {
        if ($On.IsPresent)
        {
          $slxOldValue = $null
          $slxOldValue = Get-ItemProperty $clefAModifier -Name "slxOldValue" -ErrorAction SilentlyContinue
          if ($slxOldValue -eq $null)
          {
            New-ItemProperty $clefAModifier -Name "slxOldValue" -Value $oldCmdValue  -PropertyType "String" | Out-Null
            New-ItemProperty $clefAModifier -Name "(default)" -Value $TexteCommande  -PropertyType "ExpandString" | Out-Null
            Write-Host "Done !"
          }
          else
          {
            Write-Host "Already done!"
          }
        }
        else
        {
          $slxOldValue = $null
          $slxOldValue = Get-ItemProperty $clefAModifier -Name "slxOldValue" -ErrorAction SilentlyContinue
          if ($slxOldValue -ne $null)
          {
            New-ItemProperty $clefAModifier -Name "(default)" -Value $slxOldValue."slxOldValue"  -PropertyType "String" | Out-Null
            Remove-ItemProperty $clefAModifier -Name "slxOldValue"
            Write-Host "Done!"
          }
          else
          {
            Write-Host "No former value!"
          }
        }
      }
    }
    catch
    {
      $_.exception.message
    }
  }
  end {}
}

2
これを機能させるには、次の場所で変更する必要があります:Computer \ HKEY_CLASSES_ROOT \ Applications \ powershell.exe \ Shell \ Open \ Command。これがなぜかを説明するのに十分なほどレジストリを理解していません。Powershell 3.0を実行しているためでしょうか?とにかく、スクリプトをありがとう。
Wouter

15

レジストリを調整する必要があります。これはデフォルトでは設定されていないため、最初にHKEY_CLASSES_ROOTのPSDriveを構成します。このためのコマンドは次のとおりです。

New-PSDrive HKCR Registry HKEY_CLASSES_ROOT

これで、通常のHKCUおよびHKLM PSDriveと同じように、HKEY_CLASSES_ROOTのレジストリキーと値を移動および編集できます。

ダブルクリックを構成してPowerShellスクリプトを直接起動するには:

Set-ItemProperty HKCR:\Microsoft.PowerShellScript.1\Shell '(Default)' 0

PowerShell ISEでPowerShellスクリプトを開くようにダブルクリックを構成するには:

Set-ItemProperty HKCR:\Microsoft.PowerShellScript.1\Shell '(Default)' 'Edit'

デフォルト値に戻すには(ダブルクリックしてPowerShellスクリプトをメモ帳で開くように設定します):

Set-ItemProperty HKCR:\Microsoft.PowerShellScript.1\Shell '(Default)' 'Open'

Elevated PowerShell ISEの最後の行を使用してデフォルト値を復元しようとしましたが、Thermionixのようなコマンドを使用した場合、デフォルトが置き換えられるため、Shell。コマンドを明示的にリセットする必要があります(ただし、そのための正しい構文なので、[コントロールパネル]> [プログラム]> [ファイルの関連付け]を実行する必要がありました。
dragon788

13

システム設定を設定することは少し多いかもしれませんが、ハードコードされたパスを必要とするショートカットは理想的ではないことに同意します。バットファイルは実際に問題をうまく解決します

RunMyPowershellScript.bat

 start powershell -command "& '.\MyPowershellScript.ps1' -MyArguments blah"

このバッチファイルをダブルクリックすると、バッチファイルへのショートカットを簡単に作成でき、スクリプトを任意のフォルダーに展開できます。


batファイルと同じフォルダにps1スクリプトが必要であることに注意してください。2つのファイルを維持することを犠牲にして、コピーペースト機能を取得します。
jiggunjer

11

これをレジストリに設定する簡単なPowerShellコマンド。

New-PSDrive -Name HKCR -PSProvider Registry -Root HKEY_CLASSES_ROOT
Set-ItemProperty -Path "HKCR:\Microsoft.PowerShellScript.1\Shell\open\command" -name '(Default)' -Value '"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -noLogo -ExecutionPolicy unrestricted -file "%1"'

5
もう少しセキュリティを確保するExecutionPolicy RemoteSignedために、ネットワーク/インターネットからダウンロードされたランダムスクリプト(ローカルで作成されていないことを示すメタデータを含む)がダブルクリックから実行されないようにすることをお勧めします。 .ps1ファイルにコードを貼り付けると、メタデータが関連付けられていないため、実行されます。
dragon788

6
  1. REGEDITをHKEY_LOCAL_MACHINE \ SOFTWARE \ Classes \ Microsoft.PowerShellScript.1 \ Shellに移動します
  2. 右側のペインで、「(デフォルト)」をダブルクリックします
  3. 「Open」(メモ帳を起動する)の既存の値を削除し、「0」を入力します(ゼロであるため、Powershellを直接起動します)。

メモ帳をデフォルトとして再び使用する場合は、値を元に戻します。


5

あなたは、デフォルトのファイルの関連付けを設定するps1ようにファイルをpowershell.exeあなたがそれをダブルクリックしてPowerShellスクリプトを実行できるようになります。

Windows 10では

  1. を右クリック ps1ファイルを
  2. クリック Open with
  3. クリック Choose another app
  4. ポップアップウィンドウで、 More apps
  5. 一番下までスクロールして選択します Look for another app on this PC
  6. 参照して選択 C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
  7. リストアイテム

これにより、ファイルの関連付けが変更され、ファイルps1をダブルクリックして実行されます。設定することでデフォルトの動作に戻すことができますnotepad.exeデフォルトのアプリにすることで、デフォルトのます。

ソース


1
これは正常に動作しますが、Vizmiの答えをほぼ複製します。
Marteng 2018

4

同じ名前の.ps1ファイルを含む単純な.cmdファイルをサブフォルダーに配置します。たとえば、「foobar」という名前のスクリプトには「foobar.ps1」と「foobar.cmd」があります。したがって、.ps1を実行するには、エクスプローラーから.cmdファイルをクリックするか、コマンドプロンプトから.cmdを実行するだけです。.cmdファイルは独自の名前を使用して.ps1を自動的に検索するため、同じベース名を使用しています。

::====================================================================
:: Powershell script launcher
::=====================================================================
:MAIN
    @echo off
    for /f "tokens=*" %%p in ("%~p0") do set SCRIPT_PATH=%%p
    pushd "%SCRIPT_PATH%"

    powershell.exe -sta -c "& {.\%~n0.ps1 %*}"

    popd
    set SCRIPT_PATH=
    pause

pushd / popdを使用すると、スクリプトが配置されている特定のディレクトリに移動しなくても、コマンドプロンプトから.cmdファイルを起動できます。スクリプトディレクトリに移動し、完了したら元のディレクトリに戻ります。

スクリプトの終了時にコマンドウィンドウを非表示にする場合は、一時停止を解除することもできます。

私の.ps1スクリプトにパラメーターがある場合、.NETフォームを使用してGUIプロンプトでプロンプトを表示しますが、代わりに渡す場合は、パラメーターを受け入れるのに十分な柔軟性をスクリプトに与えます。この方法では、エクスプローラーでダブルクリックするだけで、パラメーターの詳細を知る必要がありません。リストボックスや他のフォームを使用して、必要なものを尋ねてきます。


2
バッチファイルをありがとう。ご存知のように、 "for"ステートメントを "set SCRIPT_PATH =%〜p0"(引用符なし)に置き換えることができます。実際、私は〜p0の代わりに〜dp0を使用するので、ドライブ間で動作します。これは自分で使います。
zumalifeguard 2015年

2

これはKoZm0kNoTの回答に基づいています。ドライブ全体で機能するように変更しました。

@echo off
pushd "%~d0"
pushd "%~dp0"
powershell.exe -sta -c "& {.\%~n0.ps1 %*}"
popd
popd

2つのpushd / popdsは、ユーザーのcwdが別のドライブにある場合に必要です。外部セットがないと、スクリプトを含むドライブのcwdが失われます。


2

これは私がデフォルトでスクリプトを管理者として実行するために使用するものです:

Powershell.exe -Command "& {Start-Process PowerShell.exe -Verb RunAs -ArgumentList '-File """%1"""'}"

これをregeditにデフォルト値として貼り付ける必要があります。

HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\Open\Command

または、次のスクリプトを実行してください。

$hive = [Microsoft.Win32.RegistryKey]::OpenBaseKey('ClassesRoot', 'Default')
$key = $hive.CreateSubKey('Microsoft.PowerShellScript.1\Shell\Open\Command')
$key.SetValue($null, 'Powershell.exe -Command "& {Start-Process PowerShell.exe -Verb RunAs -ArgumentList ''-File """%1"""''}"')

2

高度なWindows管理に精通している場合は、このADMパッケージ(手順はそのページに含まれています)を使用して、このテンプレートとローカルGPOをダブルクリックした後にPowerShellスクリプトを実行できます。この後、.ps1ファイルタイプに関連付けられているデフォルトのプログラムをpowershell.exe(検索を使用すると、かなり隠されています)に変更するだけで、ダブルクリックでPowerShellスクリプトを実行できます。

それ以外の場合は、これらの管理ツールでシステム全体を台無しにする可能性があるため、他の提案に固執することをお勧めします。

デフォルトの設定は厳しすぎると思います。誰かがなんらかの悪意のあるコードをコンピューターに配置した場合、そのユーザーはこの制限を回避することもでき(.cmdファイルまたは.exeにラップするか、ショートカットを使用してトリックします)、結局のところ、それを防止するだけです。作成したスクリプトを実行する簡単な方法から。


インストールすると、この設定は「ローカルグループポリシーエディター」の「ローカルコンピューターポリシー->コンピューターの構成->管理用テンプレート-> Windowsコンポーネント」にあります。そこで、それを有効にして、ドロップダウンリストでポリシーが選択されていることを確認してください。
Wouter

1

Windowsの「SendTo」機能を使用して、PS1スクリプトの実行を容易にすることができます。この方法を使用すると、PS1スクリプトを右クリックして実行できます。これは、OPの質問に正確に答えるものではありませんが、近いです。うまくいけば、これは他の人にとって有用です。ところで、これは他のさまざまなタスクに役立ちます。

  • Powershell.exeの検索/検索
  • Powershell.exeを右クリックし、[ファイルの場所を開く]を選択します
  • Powershell.exeを右クリックし、[ショートカットの作成]を選択します。デスクトップのような場所を一時的に保存します
  • デフォルトで管理者として開くことをお勧めします。ショートカット>プロパティ>詳細設定>管理者として開くを選択します。
  • Sendtoフォルダーを開きます。スタート>ファイル名を指定して実行> Shell:Sendto
  • Powershell.exeショートカットをSendtoフォルダーに移動します。
  • これで、PS1スクリプトを右クリックできるはずです。
  • PS1ファイルを右クリックし、SendToコンテキストオプションを選択> Powershellショートカットを選択
  • PS1スクリプトが実行されます。

1
これはデフォルトの「Powershellで実行」コンテキストメニューオプションよりも優れていますか?
elBradford、

1

私はこれを使用しました(一度だけ実行する必要があります)。また、実行する権限があることを確認してください。

昇格した権限を持つPowerShellから:

Set-ExecutionPolicy=RemoteSigned

次に、batファイルから:

-----------------------------------------

 ftype Microsoft.PowerShellScript.1="C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe" -noexit ^&'%%1'

 assoc .ps1=Microsoft.PowerShellScript.1

-----------------------------------------
auto exit: remove -noexit 

そして出来上がり。* .ps1をダブルクリックすると実行されます。


The term '%1' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
ajeh 2017

レジストリキーで承認された回答からのコマンドを使用すると、承認された回答とこの回答の組み合わせのみが機能しました。どうやら実行するassoc必要があります。
ajeh 2017

@ajeh(パーティーにビエンが降りて申し訳ありません。このエラーが発生した場合は、間違った一重引用符があるためです。必ずUTF-8を使用してください。(notepad ++を使用してください。2つの文字列をドロップして、runme.cmdファイルとして保存してください。 )
Paul Fijma

1

Windows 10では、ファイル拡張子の関連付けに対するWindowsエクスプローラーのオーバーライドを削除することもできます。

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ps1\UserChoice

HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\open\command他の回答で言及されている変更に加えて。

https://stackoverflow.com/a/2697804/1360907を参照してください


1

私はこの質問の一番上の答えを試しましたが、エラーメッセージが表示されました。それから私はここで答えを見つけました:

PowerShellは、「このシステムではスクリプトの実行が無効になっている」と述べています。

私にとってうまくいったのは、このソリューションを使用することでした:

powershell -ExecutionPolicy Bypass -File script.ps1

これを.batファイルに貼り付け、ダブルクリックできます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.