如何在电源外壳中自动打开多个电源外壳?

时间:2019-10-04 21:22:25

标签: powershell

我有my_project.ps1文件,可以从其中激活虚拟环境并启动我的项目。

当前,我需要打开Powershell,然后再进入保存.ps1文件的目录,并且只能从Powershell中打开它。

有什么办法可以双击.ps1文件,它会在Power Shell中自动打开吗?

3 个答案:

答案 0 :(得分:1)

根据设计,Windows shell(桌面,文件资源管理器,任务栏,“开始”菜单)中双击(打开)*.ps1文件不会 执行它们-而是根据记事本或Windows PowerShell版本,在记事本或PowerShell ISE中打开它们进行编辑

但是,至少从Windows 7开始,*.ps1文件的快捷菜单包含 Run with PowerShell命令, / em>调用手边的脚本; 足以满足您的目的,但是此调用方法有局限性-有关详细信息,请参见底部。

如果您要 重新定义双击/打开以使其执行 *.ps1脚本,则有两个选择:


GUI方法:

默认情况下,使用文件资源管理器使PowerShell执行.ps1文件:

  • 右键单击.ps1文件,然后选择Properties
  • 单击Change...标签旁边的Opens with:
  • 单击列表底部的More apps,然后向下滚动到Look for another app on this PC
  • 浏览或粘贴文件路径C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe并提交。

此方法使您无法控制PowerShell调用的具体情况;实际上,您将获得以下行为:

  • 重新定义仅对当前用户有效-这可能是一件好事,因为其他用户可能不会期望此更改,这可能导致脚本的不必要执行。 / p>

  • 无论有效的执行策略如何,都将得到遵守;例如,如果Restricted有效,则调用将完全失败。

  • 与默认的Run in PowerShell命令一样,除非脚本在退出前明确提示用户,否则运行脚本的窗口将自动关闭

要对PowerShell调用脚本的方式进行更多控制,请使用下面显示的编程方法。


编程方法:

修改注册表,以便为Open上的*.ps1个文件重新定义HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\shell\Open\Command快捷菜单命令,如下所示。

重要:如果您以前使用过上述GUI方法,则必须手动删除基础注册表定义,否则编程性重新定义将不会生效:< / p>

  • 打开regedit.exe(需要管理员权限)

  • 导航至HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ps1删除该密钥。

  • 注意:至少在Windows 10上,尝试通过编程方式删除此键 -例如由于权限问题,即使以admin身份运行,使用reg delete HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ps1\UserChoice /f的操作也会失败。

注意

  • 该代码仅为当前用户重新定义命令,这可能是更好的方法,因为其他用户可能不会期望此更改,这可能导致脚本的不必要执行。 / p>

    • 如果您仍然希望更改为 all 个用户,请将下面的$forAllUsers设置为$true,但请注意,然后必须运行代码< em>升高(以管理员身份)。
  • 与标准Run in PowerShell命令不同,下面的代码保留了脚本执行 open 和会话 alive 的窗口。

  • 无论有效的执行策略如何,都将得到遵守;例如,如果Restricted有效,则调用将完全失败。

    • 在下面的代码中,您可以在-File之前加上类似-ExecutionPolicy RemoteSigned之类的内容,以覆盖有效策略,但是出于安全原因,我建议不要选择限制性较小的值。
  • 与标准Run in PowerShell命令一样,脚本在其所在目录中作为工作目录(当前位置)执行。

  • 要自定义确切的调用命令,请修改下面的$cmd = ...行。

    • 值得注意的是,要定位PowerShell Core 而不是Windows PowerShell,请将powershell.exe替换为pwsh.exe
# Specify if the change should apply to the CURRENT USER only, or to ALL users.
# NOTE: If you set this to $true - which is NOT ADVISABLE - 
#       you'll need to run this code command ELEVATED (as administrator)
$forAllUsers = $false

# Determine the chosen scope's target registry key path.
$targetKey = "$(('HKCU', 'HKLM')[$forAllUsers]):\Software\Classes\Microsoft.PowerShellScript.1\shell\Open\Command"

# In the user-specific hive (HKCU: == HKEY_CURRENT_USER), the target key
# doesn't exist by default (whereas it does in the local-machine hive (HLKM: == HKEY_LOCAL_MACHINE)),
# so we need to make sure that it exists.
if (-not $forAllUsers) {
  $null = New-Item -Force $targetKey -ErrorAction Stop
}

# Specify the command to use when opening / double-clicking *.ps1 scripts:
# As written here:
#   * The profiles are loaded (add -NoProfile to change).
#   * The current execution policy is respected (add -ExecutionPolicy <policy>)
#   * The window stays open after the script exits (remove -NoExit to change)
#   * Windows PowerShell is targeted - to target PowerShell *Core* instead,
#     replace 'powershell.exe' with 'pwsh.exe'
# For help with all parameters, see https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_powershell_exe
$cmd = "`"$((Get-Command powershell.exe)[0].Source)`" -noexit -file `"%1`""

#"# Write the command to the registry.
Set-ItemProperty -LiteralPath $targetKey -Name '(default)' -Value $cmd

预定义的Run in PowerShell快捷菜单命令:

在注册表项HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\shell\0\Command中定义(自Windows 10开始),如下所示:

"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "-Command" "if((Get-ExecutionPolicy ) -ne 'AllSigned') { Set-ExecutionPolicy -Scope Process Bypass }; & '%1'"
  • 除非执行策略AllSigned有效-在这种情况下,只有 signed 个脚本可以执行,但在没有提示的情况下执行 < / em>-该命令尝试将被调用进程的执行策略设置为Bypass,这意味着可以执行 任何脚本,但是只能在用户响应确认提示 (无论脚本是否签名,以及是否从网络下载)。

    • 至少在Windows 7早期版本/ PowerShell版本中,该命令 misdefined [1] 被有效地忽略了设置进程执行策略的尝试,这意味着将应用永久配置的任何执行策略-不会显示确认提示。
  • 除非目标脚本在退出之前明确暂停以等待用户输入,否则脚本完成后脚本将自动关闭 的窗口,因此您可能看不到其输出。

  • 目标脚本在其所在目录中执行作为工作目录(当前位置)


[1]较早的,不完整的命令定义是"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "-file" "%1" "-Command" "if((Get-ExecutionPolicy ) -ne AllSigned) { Set-ExecutionPolicy -Scope Process Bypass }",这意味着-file "%1"之后的所有内容都作为 arguments 传递到文件"%1"而不是-Command之后的命令的预期执行;另外-有争议的地方-AllSigned操作数将需要加引号。

答案 1 :(得分:0)

Server 2012和更高版本默认情况下不将.PS1文件扩展名与PowerShell可执行文件关联;相反,出于安全原因,它们默认情况下默认使用记事本打开.PS1文件。

如果具有访问权限,则需要通过控制面板中的“默认程序”更改文件关联,以使.PS1文件通过双击执行。

还请注意,您可能必须更改执行策略才能运行特定的脚本。

另外,听起来好像这个脚本可能是一种核心自动化,所以您可以使用其中任何一个在另一个脚本中执行脚本,而无需更改活动的工作目录: 调用项“” &''

答案 2 :(得分:0)

通过双击(运行)执行PS1文件

为文件创建一个快捷方式并将目标设置为:

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe "C:\Temp\MyPowershellScript.ps1"

用脚本的位置替换第二个目录(引号中的那个)。


通过双击(编辑)读取 PS1 文件

同上,但以 ISE 为目标,因为这将强制其进入编辑模式。

C:\Windows\System32\WindowsPowerShell\v1.0\powershell_ise.exe "C:\Temp\MyPowershellScript.ps1"