1

我正在尝试编写 Vista/W7 小工具。在我的实验中,我想写下系统上某些文件的修改日期。问题是,如果我想使用字符串操作函数,小工具就会停止写入其输出。小工具的部分代码如下所示:

  function format_lmd(lmd)
  {
  // Parse something like "Sun Aug 26 17:13:22 UTC+0200"
  var lmdFields = lmd.split(' ');
  //weekday  = lmdFields[0];
  //month    = lmdFields[1];
  //monthday = lmdFields[2];
  //moment   = lmdFields[3];
  //return monthday+' '+month+' '+moment;
  return lmd;
  }

  function  paintGadget()
  {   
  var fileitem = System.Shell.itemFromPath("c:\\myfile.txt");
  //canvas.addTextObject('   '+fileitem.modifyDate, 'Segoe UI', 9, 'white', text_offset, 21);
  var result = null;
  result = '   ';
  result += format_lmd(fileitem.modifyDate);
  canvas.addTextObject(result, 'Segoe UI', 9, 'white', text_offset, 21);
  }

对 split 的调用(在函数 format_lmd 中)似乎停止了脚本(或者更好的是:抛出异常)。尽管文档似乎表明 split 函数可用于将字符串拆分为多个部分,但在我的情况下它不起作用。

问题:

  • 我应该如何正确使用拆分方法?
  • 我之前没有使用过 Javascript,所以什么时候用“var”声明一个变量,什么时候不用,对我来说仍然是个谜。有没有很好的 Javascript 介绍可以用于小工具?
  • 调试小工具的最佳方法是什么?

谢谢,帕特里克

编辑:我发现了如何为 Javascript 启用调试器(请参阅http://msdn.microsoft.com/en-us/library/bb456467%28v=VS.85%29.aspx#_sidebar_overview_debugging_basic)。现在会弹出一个调试窗口并显示“预期对象”,但这并没有真正帮助我。

4

2 回答 2

1

这是 Windows 桌面小工具 API 和System.Shell命名空间的主要问题之一。一些命令返回的类型不是 JScript 本身处理的。幸运的是,这不是那些时代之一,但问题是相似的。我会得到答案,但首先,有点杂乱无章。

您在签入函数时注意到typeof lmd,结果是“日期”。奇怪的是,没有原生日期类型 JScript/ECMAScript -typeof new Date()将导致“对象”。这样做的原因是许多 System.Shell.* 方法都映射到 .net 等效方法,结果只是返回给 JScript,而无需将数据转换为 JScript 本机类型。微软的一个非常短视的实施。

将lmd输出到调试器时,您会看到一个字符串结果,例如:

2009 年 11 月 25 日星期三 11:06:30 UTC

这是因为需要字符串的函数会将非字符串参数转换为字符串。 System.Debug.outputString()在这里也不例外。意识到这一点,解决方案变得清晰 - 强制将类型转换从“日期”转换为字符串:

var lmdFields = String(lmd.split(' '));
// or
var lmdFields = (lmd+"").split(' ');

//-> ["Wed","Nov","25","11:06:30","UTC","2009"]

如果要将日期转换为 JavaScript Date对象,只需将其传递给Date()构造函数:

var lmdFields = new Date(lmd);
System.Debug.outputString(lmdFields.toLocaleString());
//-> "25 November 2009 11:06:30"
于 2010-08-21T17:45:54.633 回答
0

如果它是一个日期,那么这可能会有所帮助(未经测试,而是一个指南)......

  function format_lmd(lmd)
  {
    month = lmd.getMonth()+1; // returns numeric value
    monthday = lmd.getDay(); // 0 for Sunday, 1 for Monday, 2 for Tuesday, and so on
    // not sure what you mean for 'moment'?
    return monthday+' '+month+' '+moment;
  }

您可以在数组中提供月份和日期值,如果需要,只需查找它们。

参考: https ://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date#Methods

于 2010-08-09T01:39:12.840 回答