背景: 我为我们的第一级技术支持编写了一个小脚本,它进行了一些验证(命名约定/ ip地址范围)并更新了打印机范围的dns记录。
它从命令行或文件中获取输入,如果在命令行上没有给出输入,则从脚本中提示。
最初的问题是,当用户右键单击update-PrinterDNS.ps1并且"使用PowerShell"运行时,脚本刚刚执行并关闭。在脚本末尾添加暂停语句允许用户查看输出。但是,当调用脚本并传递参数时,这会将扳手引入自动化端。
我考虑过在命令行中添加-noPause开关,或者推出一个使用-noExit调用PowerShell的快捷方式,但这些看起来更像是解决方法而不是解决方案。
问题:) 我想知道是否可以在脚本中确定是否可以通过Windows PowerShell'运行来启动它。为了有条不紊地停顿在最后。答案 0 :(得分:4)
使用PowerShell运行具有以下命令行(默认情况下,将来可能会更改等):
powershell.exe "-Command" "if((Get-ExecutionPolicy ) -ne 'AllSigned') { Set-ExecutionPolicy -Scope Process Bypass }; & '%1'"
您可以在$MyInvocation
变量中看到您的调用方式。
另一种方法是检查执行策略,该策略在此处明确设置。除非您使用-ExecutionPolicy Bypass
启动PowerShell,否则以下情况仅适用于通过上下文菜单运行脚本的情况:
(Get-ExecutionPolicy -Scope Process) -eq 'Bypass'
就熟练的变通方法而言,我说这个应该工作一段时间。但不保证。
答案 1 :(得分:1)
使用用于启动脚本的命令填充调用行。我希望它在从PowerShell提示符调用时始终具有值,但在使用PowerShell执行时它是空的。
echo "hello world"
if ($MyInvocation.Line -eq "")
{
pause
}
答案 2 :(得分:0)
在脚本的主体中使用$ MyInvocation应该没问题。 但是,当用于从函数进行测试时,它将无法工作。
示例:
function ConditionalPause()
{
if ($MyInvocation.Line -ne "")
{
pause #will ALWAYS pause
}
# $MyInvocation.Line will be always the name of the function, i.e.: "ConditionalPause"
# $MyInvocation.Line -ne "" will always return true
}