征求PowerShell高手解答:同一个ps1脚本文件,在ISE中可以正常运行,为啥在Console中运行就会吊死?
不少PowerShell的书籍、文章,都说在提示符后面输入的内容与来自脚本文件的内容运行起来没有区别。有PowerShell高手说PowerShellISE与Consol...
不少PowerShell的书籍、文章,都说在提示符后面输入的内容与来自脚本文件的内容运行起来没有区别。有PowerShell高手说PowerShell ISE与Console有很多运行环境的差异,如对双字节字符的支持、STA与MTA等等。最近调试一个很简单的脚本,却碰到了一个莫名其妙的问题:同一个脚本文件,在ISE中运行一切正常,在Console中运行却会吊死!而在Console中粘贴脚本内容运行,却又毫无问题。先做个简单的试验:0. 编辑一个脚本文件,testfunc.ps1,内容就一行:function TestFunc{write-host "$(Get-Date):被调用"}也就是定义一个简单的函数。1. 在ISE中打开这个文件,运行,然后手动调用这个函数,有效:2. 在Console中执行这个文件,然后手动调用这个函数,无效!在ISE内嵌的Console中执行也是无效!3. 在Console中将文件内容粘贴过来运行,然后手动调用这个函数,有效:4. 在桌面创建快捷方式,PowerShell.exe –noexit –file c:\test\testfunc.ps1,双击运行,然后手动调用这个函数,有效。 这个该怎么解释?为什么拿函数做实验?因为我发现在Console中吊死就是发生在调用自定义函数的时候。尝试百度了一下,在知乎上有人也提了这个问题,被高手耻笑为不了解PowerShell基础而不了了之。用[threading.thread]::CurrentThread.GetApartmentState()检查了一下,几种方法启动的窗口中得到的结果都是STA。所以这个不是原因,至于双字节字符,更是毫无关系。
在第2种方法里,脚本运行结束,函数和变量就都消失了,而后台job一旦调用脚本中定义的函数,就会吊死,命令行调用函数则提示出错。
在文件路径前面加个点,采用dot-sourcing的方式运行,则没有问题,和其他几种方式效果一样。 展开
在第2种方法里,脚本运行结束,函数和变量就都消失了,而后台job一旦调用脚本中定义的函数,就会吊死,命令行调用函数则提示出错。
在文件路径前面加个点,采用dot-sourcing的方式运行,则没有问题,和其他几种方式效果一样。 展开
2个回答
展开全部
我觉得可能是作用域的问题.
你在调用.ps1想用里面函数的时候相当于开启了一个新的进程在运行这个.PS1,当你这个脚本运行完的时候,进程结束.里面的内容也就消失了.这个时候你去调用.ps1里的函数时,自然就是调用不到的.
而你在使用ISE的时候,你的PS1执行是在ISE的进程里执行的.所以里面的内容也就保留在ISE进程里,这个时候你去调PS1里的函数时,自然就可以调用了.
我没有深入研究这个问题.不能肯定准确,你可以参考一下.但可以肯定的是PowerShell的Console和ISE是百分之百有区别的.在很多情况下都不能保持运行结果的一致,所以无论写什么代码,ISE下执行OK的情况下,一定要在Console下去测试运行一下.
你在调用.ps1想用里面函数的时候相当于开启了一个新的进程在运行这个.PS1,当你这个脚本运行完的时候,进程结束.里面的内容也就消失了.这个时候你去调用.ps1里的函数时,自然就是调用不到的.
而你在使用ISE的时候,你的PS1执行是在ISE的进程里执行的.所以里面的内容也就保留在ISE进程里,这个时候你去调PS1里的函数时,自然就可以调用了.
我没有深入研究这个问题.不能肯定准确,你可以参考一下.但可以肯定的是PowerShell的Console和ISE是百分之百有区别的.在很多情况下都不能保持运行结果的一致,所以无论写什么代码,ISE下执行OK的情况下,一定要在Console下去测试运行一下.
展开全部
powershell默认不能执行外部脚本(用户自己写的脚本)
详情可以查看help Set-ExecutionPolicy
Win+R -> cmd -> powershell -> help Set-ExecutionPolicy
语法: Set-ExecutionPolicy [-ExecutionPolicy] {Unrestricted | RemoteSigned | AllSigned | Restricted | Default | Bypass | Undefined} [[-Scope] {Process | CurrentUser | LocalMachine | UserPolicy | MachinePolicy}] [-Force] [-Confirm] [-WhatIf] [<CommonParameters>]
要想执行自己写的脚本只需要执行Set-ExecutionPolicy RemoteSigned命令即可。
详情可以查看help Set-ExecutionPolicy
Win+R -> cmd -> powershell -> help Set-ExecutionPolicy
语法: Set-ExecutionPolicy [-ExecutionPolicy] {Unrestricted | RemoteSigned | AllSigned | Restricted | Default | Bypass | Undefined} [[-Scope] {Process | CurrentUser | LocalMachine | UserPolicy | MachinePolicy}] [-Force] [-Confirm] [-WhatIf] [<CommonParameters>]
要想执行自己写的脚本只需要执行Set-ExecutionPolicy RemoteSigned命令即可。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询