有没有办法通过双击.ps1文件使PowerShell脚本工作?

时间:2012-04-13 07:54:46

标签: powershell powershell-v2.0

我正在向我的团队分发Powershell脚本。该脚本是从Vsphere客户端获取IP地址,进行mstsc连接并将其记录在共享文件中。

他们使用脚本的那一刻他们就知道了机器的IP地址。 之后,他们总是倾向于直接使用mstsc而不是运行powershell脚本。 (因为他们正在使用mstsc,我无法知道他们是否经常使用VM)

主要是他们告诉我运行PowerShell并不是直截了当的。

我因他们的懒惰而生病。

有没有办法通过双击.ps1文件来使PowerShell脚本工作?

20 个答案:

答案 0 :(得分:100)

创建一个类似于“目标”的快捷方式:

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

答案 1 :(得分:64)

或者,如果您希望所有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”。哈哈享受!

答案 2 :(得分:18)

请注意,PowerShell的一项安全功能是用户无法通过双击启动脚本。如果修改此设置,请务必小心。另一种方法是打包脚本。像PrimalScript这样的编辑可以做到这一点。用户仍然需要安装PowerShell,但他们可以双击exe。听起来你的团队需要一点教育。

答案 3 :(得分:15)

几年前我写了这篇文章(用管理员权限运行):

<#  
.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 {}
}

答案 4 :(得分:13)

我同意设置系统设置可能有点多,但需要硬编码路径的快捷方式并不理想。 bat文件实际上很好地解决了这个问题

RunMyPowershellScript.bat

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

现在可以双击此批处理文件,可以轻松地为批处理文件创建快捷方式,并且可以将脚本部署到任何文件夹。

答案 5 :(得分:12)

您需要调整注册表。 首先,为HKEY_CLASSES_ROOT配置一个PSDrive,因为默认情况下没有设置它。对此的命令是:

New-PSDrive HKCR Registry HKEY_CLASSES_ROOT

现在,您可以在HKEY_CLASSES_ROOT中导航和编辑注册表项和值,就像在常规HKCU和HKLM PSDrives中一样。

配置双击以直接启动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'

答案 6 :(得分:9)

这适用于Windows 10和PowerShell 5.1:

  • 右键单击.ps1文件
  • 打开...
  • 选择其他应用
  • 将powershell.exe的位置复制到地址栏(默认情况下,它不会显示Windows文件夹),即C:\ Windows \ System32 \ WindowsPowerShell \ v1.0
  • 选择powershell.exe
  • 选择&#34;始终使用此应用打开.ps1文件&#34;
  • 点击确定

答案 7 :(得分:8)

简单的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 :(得分:3)

我尝试了此问题的最高答案,但遇到错误消息。然后我在这里找到答案:

PowerShell says "execution of scripts is disabled on this system."

最适合我的是使用此解决方案:

powershell -ExecutionPolicy Bypass -File script.ps1

您可以将其粘贴到.bat文件中,然后双击它。

答案 9 :(得分:3)

在我的子文件夹中放入一个简单的.cmd文件,其中包含同名的.ps1文件,例如,一个名为&#34; foobar&#34;的脚本。会有&#34; foobar.ps1&#34;和&#34; foobar.cmd&#34;。因此,要运行.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提示,但如果我想要传递它们,还要使脚本足够灵活,以接受参数。这样我就可以从资源管理器中双击它,而不必知道参数的细节,因为它会通过列表框或其他形式询问我需要什么。

答案 10 :(得分:2)

这是我默认使用scrips作为管理员运行的方法:

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"""''}"')

答案 11 :(得分:2)

您可以使用Windows&#39; SendTo&#39;使PS1脚本运行更容易的功能。使用此方法,您可以右键单击 一个PS1脚本并执行。这并没有完全回答OP问题,但它很接近。希望这对其他人有用。 BTW ..这对你很有帮助 各种其他任务。

  • 找到/搜索Powershell.exe
  • 右键单击Powershell.exe并选择“打开文件位置”
  • 右键单击Powershell.exe并选择“创建快捷方式”。暂时保存像桌面一样的地方
  • 默认情况下,您可能希望以管理员身份打开。选择快捷方式&gt;属性&gt;高级&gt;打开管理员
  • 打开Sendto文件夹。开始&gt;运行&gt;壳:SENDTO
  • 将Powershell.exe快捷方式移至Sendto文件夹
  • 您现在应该可以右键单击PS1脚本。
  • 右键单击PS1文件,选择SendTo上下文选项&gt;选择Powershell快捷方式
  • 您的PS1脚本应该执行。

答案 12 :(得分:2)

如果您熟悉高级Windows管理,则可以使用this ADM package(该页面上包含说明)并允许在通过此模板和本地GPO双击后运行PS脚本。在此之后,您只需将与.ps1文件类型相关联的默认程序更改为powershell.exe(使用搜索,它已经完全隐藏),您就可以通过双击运行PS脚本了。

否则我建议坚持使用其他建议,因为您可以使用这些管理工具搞乱整个系统。

我认为默认设置太严格了。如果有人设法在您的计算机上放置一些恶意代码,那么他也可以绕过这个限制(将其包装到.cmd文件或.exe中,或者用快捷方式进行操作)并且它最终完成的所有操作只是为了防止您运行您编写的脚本的简便方法。

答案 13 :(得分:1)

这是基于KoZm0kNoT的答案。我将其修改为跨驱动器工作。

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

如果用户的cwd位于不同的驱动器上,则需要两个pushd / popds。如果没有外部设置,带有脚本的驱动器上的cwd将会丢失。

答案 14 :(得分: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将执行它。

答案 15 :(得分: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

答案 16 :(得分:0)

一种与UNIX shar(shell存档)相同精神的解决方案。

您可以将Powershell脚本放入扩展名为.cmd(而不是.ps1)的文件中,并将其放在开头:

@echo off
Rem Make powershell read this file, skip a number of lines, and execute it.
Rem This works around .ps1 bad file association as non executables.
PowerShell -Command "Get-Content '%~dpnx0' | Select-Object -Skip 5 | Out-String | Invoke-Expression"
goto :eof
# Start of PowerShell script here

答案 17 :(得分:0)

您可能不想,但一个简单的方法就是创建一个 .BAT 文件并将您的命令放入:

powershell ./generate-strings-table-en.ps1
powershell ./generate-conjoined-tables-it.ps1

然后双击该 BAT 文件。

答案 18 :(得分:0)

您可以将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设置为默认应用将其恢复为默认行为。

Source

答案 19 :(得分:-1)

来自http://www.howtogeek.com/204166/how-to-configure-windows-to-work-with-powershell-scripts-more-easily

HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell的默认值设置为0