我的 PowerShell 脚本仅在从 ISE 运行时才有效

Posted

技术标签:

【中文标题】我的 PowerShell 脚本仅在从 ISE 运行时才有效【英文标题】:My PowerShell script only works when running from ISE 【发布时间】:2013-03-22 22:51:22 【问题描述】:

我无法发布所有脚本内容,但基本思想是它下载 JSON 并使用 ConvertFrom-Json cmdlet 将其转换为对象。一些对象被过滤掉,其余的被写入 XML/XLS 文档(Excel 2003 格式)。然后将此文件附加到电子邮件中并发送给不同的人。

我遇到的问题是它仅在从 Powershell ISE 运行时才有效。一旦我尝试设置一个计划任务,从 cmd 调用它,甚至从 powershell 调用它,附加的文件就完全是空的。就好像某些函数没有运行(循环并创建所有行的函数)。

我暂时可以继续从 ISE 运行,但此脚本的想法是发送一封无需干预的自动电子邮件。关于可能导致此问题的任何想法?

【问题讨论】:

您需要找出中断发生的位置。您的计划任务是运行 PoSH v2 还是 v3?您说“好像某些功能无法运行”——您需要对此进行测试!在每个函数中添加一条语句以写入日志文件,指示该函数已被输入。这里真的不足以让我们诊断。您是否在 Windows 事件日志中得到任何信息? 如果从 Powershell 调用它不起作用,则通过点源 (. ./script.ps1) 在本地范围内运行它。这将使所有变量都驻留在会话中,您可以开始检查它们以查看它落在哪里。 我能够让它工作。原来我使用脚本稍后定义的另一个变量定义了一个变量。搬家后,又开始工作了。谢谢! 【参考方案1】:

您需要运行“点源”脚本 可以这样完成

powershell.exe -noexit -file c:\test.ps1

pwershell.exe -noexit ". c:\test.ps1"

请参阅 -File 部分下的此链接 http://technet.microsoft.com/en-us/library/hh847736.aspx

【讨论】:

【参考方案2】:

根据 cmets 对原始帖子的回答,该脚本似乎(出乎意料?)在 ISE 中运行,因为允许在 ISE 中运行的脚本了解使用的变量的错误/怪癖/功能在控制台窗口中,反之亦然。

当脚本使用已定义的变量(并且未在脚本中仔细初始化)运行时,这通常会导致逻辑问题或意外结果。

避免这个问题的方法:

尝试在尽可能干净的环境中测试您的代码。

http://powershell.com/cs/blogs/tips/archive/2015/02/12/getting-a-clean-powershell-environment.aspx

为确保脚本在完全干净的测试环境中运行,您 当然可以重新启动 PowerShell ISE。更方便的方法是 打开另一个 PowerShell 选项卡:在 PowerShell ISE 中,选择 File/New PowerShell 选项卡。

在脚本中使用Set-StrictMode 2 来捕获未定义的变量等。

https://technet.microsoft.com/en-us/library/hh849692.aspx

Set-StrictMode -Version 2.0

禁止引用未初始化的变量(包括字符串中未初始化的变量)。 禁止引用对象不存在的属性。 禁止使用语法调用方法的函数调用。 禁止没有名称的变量 ($)。

【讨论】:

【参考方案3】:

我遇到了这个问题,并且我使用 powershell 中的单线程函数执行脚本。 您也可以尝试其他一些选项,请访问此link 以查找更多信息。

例子

powershell.exe -noexit c:\test.ps1 -sta

【讨论】:

【参考方案4】:

将缺少的变量或函数更改为全局。

function global:mycall

【讨论】:

【参考方案5】:

开始你的脚本:

[cmdletbinding()]

【讨论】:

请在您的答案中添加一些解释,以便其他人可以从中学习

以上是关于我的 PowerShell 脚本仅在从 ISE 运行时才有效的主要内容,如果未能解决你的问题,请参考以下文章

PowerShell ISE:调试从 power-shell 脚本调用的另一个 power-shell 脚本

从 Powershell ISE 和 Windows 资源管理器运行脚本的不同行为

从 Powershell ISE 中的另一个 PS1 脚本调用 PowerShell 脚本 PS1

如何将所需的参数传递给 Powershell ISE 中的脚本?

Windows7系统中的Windows PowerShell ISE和Windows PowerShell的区别以及作用?

在powershell-ise中怎么调用powershell中的函数