2016-03-24 80 views
1

我正在創建一個對Excel文件執行某些操作的函數。 Excel文件列表作爲一個名爲$excelFiles的數組傳遞到函數中。下面顯示的代碼正在進行中(它尚未完成所有打算執行的操作)。此代碼,因爲到目前爲止寫的,看來是失敗的,因爲在$excelFile舉行的字符串設定$wb變量(嵌套foreach前右)周圍沒有引號:向來自數組的變量添加雙引號

Function CovertExcelFileToTextFiles ($excelFiles) 
{ 

    # create an Excel application object (fire off Excel in the background) 
    $excelApp = New-Object -ComObject Excel.Application 
    $excelApp.Visible = $false 
    $excelApp.DisplayAlerts = $false 

    # get first 3 letters of each file's name 
    foreach ($excelFile in $excelFiles) 
    { 
     $name = Split-Path $excelFile.FullName -Leaf #get filename only from full path 
     $prefix = $name.Substring(0,3) #get first 3 letters of filename 

     #look at contents of this variable 
     $excelFile 

     $wb = $excelApp.Workbooks.Open($excelFile)   
     foreach ($ws in $wb.Worksheets) 
     { 
      $n = $prefix + "_"+ $ws.Name 
      $n 
     } 
    } 
    $excelApp.Quit() 
} 

這裏是出現在錯誤控制檯: enter image description here

我懷疑問題的原因是缺少引號是因爲代碼在$wb設置爲硬編碼文件路徑時有效。

我很難搞清楚如何在變量周圍加上雙引號來提供設置爲$wb的行。我試過"$excelFile",編輯器在它下面放了一條紅色的波浪線,所以顯然這是不允許的。我也嘗試創建一個新變量,並用"$excelFile"填充該變量,然後將其插入$wb行中的括號中。這也會在控制檯中導致錯誤。雙引號如何在$excelFile左右?

回答

0

缺乏引號不是你的問題。當您對文件進行硬編碼並使用引號時,引號告訴解析器它是一個字符串;它們不是字符串值的一部分。

你需要知道什麼數據類型$excelFile是(即$excelFiles什麼?)。

如果您使用$excelFile.FullName是正確的,那麼看起來您正在處理一個對象。

在這種情況下,.Open()方法可能期待[String],不會明白你傳遞它的對象,所以嘗試:

$wb = $excelApp.Workbooks.Open($excelFile.FullName) 

一個很好的方法來解決這樣的事情是使用PowerShell ISE,然後設置一個斷點。

在你的情況下,在$wb = ...行上設置一個斷點,執行,當命中斷點時,執行將在該行停止(在執行之前)。

此時,您可以使用控制檯執行將在運行代碼上下文中運行的語句。因此,例如,你可以運行:

$excelFile.GetType() 

$excelFile | Get-Member 

,瞭解你正在處理的對象的一些事情。你可以看看它的屬性等。:

$excelFile.FullName 

你可以看一下你調用該方法的重載:

$excelApp.Workbooks.Open # <-- note no parentheses 
+0

是的,它是一個對象。 '$ excelFile.FullName'解決了它! – knot22

+0

你如何做一個內聯代碼片段? – knot22

+0

@ knot22請參閱我的編輯故障排除提示,這將幫助您在其他情況下找出這些問題。 – briantist