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

时间:2013-04-01 19:49:22

标签: powershell cmd scheduled-tasks powershell-v3.0 powershell-ise

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

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

我可以暂时继续从ISE运行,但是这个脚本的想法是发送一个不需要干预的自动电子邮件。关于可能导致这种情况的任何想法?

5 个答案:

答案 0 :(得分:3)

你需要运行脚本" dot sourced" 可以这样做

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

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

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

答案 1 :(得分:2)

基于对原帖的评论的回答,似乎该脚本(意外地?)在ISE中工作,因为bug / quirk / feature允许在ISE中运行的脚本知道使用的变量在控制台窗口中,反之亦然。

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

避免此问题的方法:

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

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

     

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

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

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

     

Set-StrictMode -Version 2.0

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

答案 2 :(得分:1)

我遇到过这个问题,而且我使用powershell工作的单线程函数来执行脚本。 您还可以尝试其他选项,转到此link以查找更多信息。

实施例

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

答案 3 :(得分:1)

将丢失的变量或函数更改为全局。

function global:mycall{}

答案 4 :(得分:0)

使用以下命令启动脚本:

[cmdletbinding()]