187

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

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

主要是他们告诉我运行 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 去阉割黑客”。大声笑享受!

于 2013-12-17T00:15:53.133 回答
47

这在 Windows 10 和 powershell 5.1 上对我有用:

  • 右键单击 .ps1 文件
  • 打开用...
  • 选择其他应用
  • 将powershell.exe的位置复制到地址栏(默认不显示windows文件夹)即C:\Windows\System32\WindowsPowerShell\v1.0
  • 选择 powershell.exe
  • 选择“始终使用此应用打开 .ps1 文件”
  • 点击确定
于 2017-08-23T05:06:40.547 回答
22

请注意,PowerShell 的一项安全功能是用户无法通过双击启动脚本。如果您修改此设置,请务必小心。另一种方法可能是打包您的脚本。一些像 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

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

RunMyPowershellScript.bat

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

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

于 2014-08-12T20:08:43.617 回答
16

您需要调整注册表。首先,为 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'
于 2016-02-19T12:23:10.853 回答
12

简单的 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"'
于 2014-06-16T07:56:28.013 回答
8
  1. 将 REGEDIT 导航到 HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Microsoft.PowerShellScript.1\Shell
  2. 在右侧窗格中,双击“(默认)”
  3. 删除“Open”的现有值(启动记事本)并键入“0”(为零,直接启动 Powershell)。

如果您希望再次使用记事本作为默认值,请恢复该值。

于 2015-08-25T09:24:14.160 回答
8

您可以将文件的默认文件关联设置为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您可以通过设置为默认应用程序将其更改回其默认行为。

来源

于 2018-07-17T02:30:34.527 回答
7

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

于 2015-05-20T18:57:17.300 回答
7

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

PowerShell 说“在这个系统上禁用了脚本的执行”。

对我有用的是使用这个解决方案:

powershell -ExecutionPolicy Bypass -File script.ps1

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

于 2020-01-14T08:46:56.007 回答
4

与 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
于 2020-12-15T22:50:41.097 回答
3

如果您熟悉高级 Windows 管理,那么您可以使用此 ADM 包(说明包含在该页面上)并允许在通过此模板和本地 GPO 双击后运行 PowerShell 脚本。在此之后,您可以简单地将与 .ps1 文件类型关联的默认程序更改为powershell.exe(使用搜索,它非常隐藏)并且您已准备好通过双击运行 PowerShell 脚本。

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

我认为默认设置太严格了。如果有人设法在您的计算机上放置了一些恶意代码,那么他/她也能够绕过此限制(将其包装到 .cmd 文件或 .exe 中,或使用快捷方式进行欺骗),最终完成的只是为了防止您可以通过简单的方式运行您编写的脚本。

于 2012-06-16T22:49:43.817 回答
2

我用过这个(只需要运行一次);还要确保您有权执行:

来自具有提升权限的 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 将执行它。

于 2015-06-04T13:21:09.740 回答
2

这是基于 KoZm0kNoT 的回答。我修改它以跨驱动器工作。

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

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

于 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 回答
1

您可以使用 Windows 的“SendTo”功能来更轻松地运行 PS1 脚本。使用此方法,您可以右键单击 PS1 脚本并执行。这并不能完全回答 OP 问题,但很接近。希望这对其他人有用。顺便说一句..这对各种其他任务很有帮助。

  • 定位/搜索 Powershell.exe
  • 右键单击 Powershell.exe 并选择打开文件位置
  • 右键单击 Powershell.exe 并选择创建快捷方式。暂时保存一些地方,比如你的桌面
  • 您可能希望默认以管理员身份打开。选择快捷方式 > 属性 > 高级 > 以管理员身份打开
  • 打开发送到文件夹。开始 > 运行 > Shell:Sendto
  • 将 Powershell.exe 快捷方式移动到 Sendto 文件夹
  • 您现在应该能够右键单击 PS1 脚本。
  • 右键单击 PS1 文件,选择 SendTo 上下文选项 > 选择 Powershell 快捷方式
  • 您的 PS1 脚本应该执行。
于 2017-07-28T01:35:17.630 回答
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

于 2019-06-14T14:03:32.330 回答
1

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

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

然后双击所说的BAT文件。

于 2021-04-13T08:30:11.783 回答
0

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

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

于 2015-11-26T22:04:05.433 回答