web-dev-qa-db-ja.com

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

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

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

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

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

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

108
Samselvaprabu

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

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

または、すべての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」と呼びます。 LOLお楽しみください!

67
user3071883

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

17
Jeffery Hicks

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

<#
.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 - [email protected]
    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 {}
}
15
JPBlanc

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

RunMyPowershellScript.bat

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

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

13
Rick

レジストリを微調整する必要があります。最初に、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'
12
Alex Langer

これはWindows 10とPowerShell 5.1でうまくいきました:

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

レジストリでこれを設定する単純な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"'
8
Thermionix
  1. REGEDITをHKEY_LOCAL_MACHINE\SOFTWARE\Classes\Microsoft.PowerShellScript.1\Shellに移動します
  2. 右側のペインで、「(デフォルト)」をダブルクリックします
  3. 「Open」(メモ帳を起動)の既存の値を削除し、「0」(Powershellを直接起動するゼロ)を入力します。

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

6
gth

同じ名前の.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 Formsを使用してGUIプロンプトでそれらのプロンプトを表示しますが、代わりにそれらを渡す場合は、パラメーターを受け入れるためにスクリプトを十分に柔軟にします。この方法で、エクスプローラからダブルクリックするだけで、リストボックスやその他のフォームで必要なものを尋ねられるため、パラメータの詳細を知る必要はありません。

3
KoZm0kNoT

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

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

デフォルト設定は厳しすぎると思います。誰かがあなたのコンピューターに悪意のあるコードを置くことができた場合、彼/彼女はこの制限をバイパスすることもできます(.cmdファイルまたは.exeにラップするか、ショートカットでトリックします)。あなたが書いたスクリプトを実行する簡単な方法から。

2
Jirrick

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

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

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

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
Mica

これは、KoZm0kNoTの回答に基づいています。ドライブ間で動作するように変更しました。

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

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

2
zumalifeguard

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
elBradford

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

昇格された権限を持つ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をダブルクリックすると実行されます。

1
Paul Fijma

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
Chris Xue