我正在创建一个对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()
}
我怀疑问题是缺少引号的原因是,如果将$wb
设置为硬编码文件路径,则代码可以正常工作。
我很难弄清楚如何在变量周围加上双引号以输入设置$wb
的行。我试过"$excelFile"
并且编辑在它下面放了一条红色的波浪线显然是不允许的。我还尝试创建一个新变量并用"$excelFile"
填充它,然后将其插入$wb
行的括号中。这也导致控制台出错。双引号如何放在$excelFile
附近?
答案 0 :(得分:0)
缺少报价不是你的问题。当您对文件进行硬编码并使用引号时,引号会告诉解析器它是一个字符串;它们不是字符串值的一部分。
您需要知道$excelFile
是什么数据类型(即$excelFiles
是 what 的数组?)。
如果您使用$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