我有my_project.ps1文件,可以从其中激活虚拟环境并启动我的项目。
当前,我需要打开Powershell,然后再进入保存.ps1文件的目录,并且只能从Powershell中打开它。
有什么办法可以双击.ps1文件,它会在Power Shell中自动打开吗?
答案 0 :(得分:1)
根据设计,从Windows shell(桌面,文件资源管理器,任务栏,“开始”菜单)中双击(打开)*.ps1
文件不会 执行它们-而是根据记事本或Windows PowerShell版本,在记事本或PowerShell ISE中打开它们进行编辑
但是,至少从Windows 7开始,*.ps1
文件的快捷菜单包含 Run with PowerShell
命令, / em>调用手边的脚本; 足以满足您的目的,但是此调用方法有局限性-有关详细信息,请参见底部。
*.ps1
脚本,则有两个选择:默认情况下,使用文件资源管理器使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>
$forAllUsers
设置为$true
,但请注意,然后必须运行代码< em>升高(以管理员身份)。与标准Run in PowerShell
命令不同,下面的代码保留了脚本执行 open 和会话 alive 的窗口。
无论有效的执行策略如何,都将得到遵守;例如,如果Restricted
有效,则调用将完全失败。
-File
之前加上类似-ExecutionPolicy RemoteSigned
之类的内容,以覆盖有效策略,但是出于安全原因,我建议不要选择限制性较小的值。与标准Run in PowerShell
命令一样,脚本在其所在目录中作为工作目录(当前位置)执行。
要自定义确切的调用命令,请修改下面的$cmd = ...
行。
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
,这意味着可以执行 任何脚本,但是只能在用户响应确认提示 (无论脚本是否签名,以及是否从网络下载)。
除非目标脚本在退出之前明确暂停以等待用户输入,否则脚本完成后脚本将自动关闭 的窗口,因此您可能看不到其输出。
目标脚本在其所在目录中执行作为工作目录(当前位置)
[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)
为文件创建一个快捷方式并将目标设置为:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe "C:\Temp\MyPowershellScript.ps1"
用脚本的位置替换第二个目录(引号中的那个)。
同上,但以 ISE 为目标,因为这将强制其进入编辑模式。
C:\Windows\System32\WindowsPowerShell\v1.0\powershell_ise.exe "C:\Temp\MyPowershellScript.ps1"