2013-11-26 63 views
3

我有一個基本的linq查詢,我想把一個CSV文件。從LinqPad運行時,下面的代碼工作正常:LinqPad(LpRun)命令腳本創建CSV文件

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腳本?

回答

5

克里斯是正確的:通過省略琅開關啓動。除非您想從存儲在.linq腳本中的內容中進行更改,否則您不需要指定連接。

還有一個問題:您的查詢正在將數據寫入CSV文件,並且您還要求lprun將輸出寫入相同的文件(由於不會轉儲任何內容,因此將爲空)。所以你最終會覆蓋空白的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 
4

我認爲你的問題是,你明確告訴LinqPad執行該文件作爲「表達式」(-lang=e標誌)。我懷疑它會工作,如果你使用-lang=s(聲明)。值得注意的是,由於您運行的是.linq文件,因此您可能不需要指定lang標誌(lang選項通常適用於運行純文本文件)。

如果你在一個文本編輯器打開.linq文件,如果你在LinqPad保存腳本,你會看到這樣的事情在頂部:<Query Kind="Statements" />這LinqPad將用它來確定如何運行腳本(除非你重寫它)。

進一步信息:http://www.linqpad.net/lprun.aspx