187

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

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

主に、PowerShell を実行するのは簡単ではないということです。

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

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

4

21 に答える 21

170

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

powershell.exe -command "& 'C:\A path with spaces\MyScript.ps1' -MyArguments blah"
于 2012-04-13T08:04:58.847 に答える
100

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

于 2013-12-17T00:15:53.133 に答える
22

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

于 2012-04-13T17:51:00.573 に答える
18

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

<#
.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 {}
}
于 2012-04-13T08:22:22.173 に答える
16

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

RunMyPowershellScript.bat

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

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

于 2014-08-12T20:08:43.617 に答える
8
  1. REGEDIT を HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Microsoft.PowerShellScript.1\Shell に移動します。
  2. 右側のペインで、[(デフォルト)] をダブルクリックします。
  3. 「Open」(メモ帳を起動) の既存の値を削除し、「0」(Powershell を直接起動するゼロ) と入力します。

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

于 2015-08-25T09:24:14.160 に答える
7

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

于 2015-05-20T18:57:17.300 に答える
3

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

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

初期設定は厳しすぎると思います。誰かが悪意のあるコードをあなたのコンピュータに置くことに成功した場合、その人はこの制限を回避することもできます (.cmd ファイルまたは .exe にラップするか、ショートカットを使用してトリックします)。作成したスクリプトを実行する簡単な方法から。

于 2012-06-16T22:49:43.817 に答える
2

This is based on KoZm0kNoT's answer. I modified it to work across drives.

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

The two pushd/popds are necessary in case the user's cwd is on a different drive. Without the outer set, the cwd on the drive with the script will get lost.

于 2015-06-12T19:10:52.297 に答える
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"""''}"')
于 2016-01-17T06:32:57.730 に答える
0

http://www.howtogeek.com/204166/how-to-configure-windows-to-work-with-powershell-scripts-more-easylyから:

のデフォルト値を設定しHKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shellます0

于 2015-11-26T22:04:05.433 に答える