LinqPad(LpRun)命令脚本创建CSV文件

时间:2013-11-26 17:08:14

标签: c# powershell command-line linqpad

我有一个基本的linq查询,我想把它放到CSV文件中。从LinqPad运行时,以下代码正常工作:

var phxTix = Companies
.Select (c => new { 
    Ticker = c.Ticker.Trim(),
    FameTick = c.Coverage_Status.Trim()});

Util.WriteCsv(phxTix, @"c:\Temp\phxticks.csv");

但是当我从命令行运行以下Powershell脚本时出现错误:

$srcLoc = "c:\linqscripts\GetPhxTix.linq"
$destLoc = "c:\Temp\phxticks.csv"
lprun -lang=e -cxname=myDB -format=csv $srcLoc > $destLoc

我得到的错误是:

lprun : c:\Users\AppData\Local\Temp\LINQPad\_ibakcumi\query_bggevp.cs(35,36) : error CS1513: } 
expected
At c:\PS\GetPhxTicksJob.ps1:4 char:1
+ lprun -lang=e -cxname=myDB $srcLoc > $destLoc
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (c:\Users\...513: } expected:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError

c:\linqscripts\GetPhxTix.linq(31,3) : error CS1519: Invalid token ')' in class, struct, or 
interface member declaration
c:\linqscripts\GetPhxTix.linq(33,1) : error CS1022: Type or namespace definition, or end-of-file expected

我做错了什么?或者我执行这个cli脚本时缺少什么?

2 个答案:

答案 0 :(得分:5)

Chris是正确的:首先省略-lang开关。您也不需要指定连接,除非您想要从存储在.linq脚本中的内容进行更改。

还有另一个问题:您的查询是将数据写入CSV文件,并且您还告诉lprun将输出写入同一文件(由于它不会转储任何内容,因此将为null)。所以你最终会用空白的文件覆盖CSV文件。

要解决此问题,您需要在一种方法和另一种方法之间做出决定。在LINQ文件本身中调用Util.WriteCsv(正如您所做),并在不重定向输出的情况下调用lprun,或从查询中删除对Util.WriteCsv的调用,并将查询语言更改为“C#Expression”。如果您执行后者,您的查询应如下所示:

Companies
.Select (c => new { 
    Ticker = c.Ticker.Trim(),
    FameTick = c.Coverage_Status.Trim()})

你对lprun的调用应该是这样的:

lprun -format=csv $srcLoc > $destLoc

答案 1 :(得分:4)

我认为您的问题是您明确告诉LinqPad将该文件作为“表达式”(-lang=e标志)执行。我怀疑如果您使用-lang=s(声明)它会起作用。

值得注意的是,由于您正在运行.linq文件,因此您可能根本不需要指定lang标志(lang选项通常很方便用于运行普通txt文件)

如果你在文本编辑器中打开.linq文件,如果你在LinqPad中保存了脚本,你应该在顶部看到类似的内容:<Query Kind="Statements" /> LinqPad将使用它来确定如何运行脚本(除非你覆盖它)。

更多信息:http://www.linqpad.net/lprun.aspx