我正在向我的团队分发一个PowerShell脚本。该脚本从Vsphere客户端获取一个IP地址,建立一个mstsc连接,并将其记录在共享文件中。
他们一使用脚本就知道了机器的IP地址。在此之后,他们总是倾向于直接使用mstsc,而不是运行PowerShell脚本。 (因为他们正在使用mstsc,我不知道他们是否经常使用VM。)
他们主要告诉我,运行PowerShell并不简单。
我对他们的懒惰感到厌恶。
是否有一种方法可以通过双击.ps1文件来使PowerShell脚本工作?
我正在向我的团队分发一个PowerShell脚本。该脚本从Vsphere客户端获取一个IP地址,建立一个mstsc连接,并将其记录在共享文件中。
他们一使用脚本就知道了机器的IP地址。在此之后,他们总是倾向于直接使用mstsc,而不是运行PowerShell脚本。 (因为他们正在使用mstsc,我不知道他们是否经常使用VM。)
他们主要告诉我,运行PowerShell并不简单。
我对他们的懒惰感到厌恶。
是否有一种方法可以通过双击.ps1文件来使PowerShell脚本工作?
当前回答
这是我默认以admin身份运行的脚本:
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"""''}"')
其他回答
或者如果你想让所有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去阉割黑客”。LOL享受吧!
请注意,PowerShell的安全特性之一是用户不能通过双击启动脚本。如果要修改此设置,请务必小心。另一种选择可能是打包脚本。像PrimalScript这样的编辑器可以做到这一点。用户仍然需要安装PowerShell,然后他们可以双击exe。听起来你的团队需要一点教育。
我尝试了这个问题的最重要的答案,但遇到了错误消息。然后我在这里找到了答案:
PowerShell表示“在此系统上禁止执行脚本”。
对我来说效果很好的是使用这个解决方案:
powershell -ExecutionPolicy Bypass -File script.ps1
您可以将其粘贴到.bat文件中并双击它。
与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
在我的子文件夹中放一个简单的.cmd文件和同名的.ps1文件,例如,一个名为“foobar”的脚本会有“foobar. exe”。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提示来提示它们,但也要使脚本足够灵活,以便在我想要传递参数时接受参数。这样我就可以从资源管理器中双击它,而不必知道参数的详细信息,因为它会用列表框或其他形式询问我需要什么。