Vba 保存CSV文件所需的文件操作,以便PowerCLI读取数据

Vba 保存CSV文件所需的文件操作,以便PowerCLI读取数据,vba,excel,powershell,csv,powercli,Vba,Excel,Powershell,Csv,Powercli,我正在使用VBA脚本将数据从Excel电子表格导出到CSV文件,以便通过带有PowerCLI脚本的导入CSV命令自动执行VM创建过程。我使用的VBA脚本是: Function BuildValuesString(colIndex As String, rows As String) As String Dim val As Variant For Each val In Split(rows, ",") If Cells(val, colIndex) <&

我正在使用VBA脚本将数据从Excel电子表格导出到CSV文件,以便通过带有PowerCLI脚本的导入CSV命令自动执行VM创建过程。我使用的VBA脚本是:

Function BuildValuesString(colIndex As String, rows As String) As String
    Dim val As Variant

    For Each val In Split(rows, ",")
        If Cells(val, colIndex) <> "" Then BuildValuesString = BuildValuesString & Cells(val, colIndex).Value & ","
    Next val
End Function
Function BuildNullStrings(numNullStrings As Long) As String
    Dim iNullStrings As Long

    For iNullStrings = 1 To numNullStrings
        BuildNullStrings = BuildNullStrings & "" & ","
    Next iNullStrings
End Function


Sub WriteCSVFile2()

    Dim My_filenumber As Integer
    Dim logSTR As String

    My_filenumber = FreeFile

    logSTR = logSTR & "1." & ","
    logSTR = logSTR & "2." & ","
    logSTR = logSTR & "3." & ","
    logSTR = logSTR & "4." & ","
    logSTR = logSTR & "5." & ","
    logSTR = logSTR & "6." & ","
    logSTR = logSTR & "Name" & ","
    logSTR = logSTR & "Cluster" & ","
    logSTR = logSTR & "VLAN" & ","
    logSTR = logSTR & "NumCPU" & ","
    logSTR = logSTR & "MemoryGB" & ","
    logSTR = logSTR & "C" & ","
    logSTR = logSTR & "D" & ","
    logSTR = logSTR & "App" & ","

    logSTR = logSTR & Chr(13)

    logSTR = logSTR & BuildValuesString("C", "18,19,20,21,22")
    logSTR = logSTR & BuildValuesString("C", "26,27,28,29,30,31,32,33")

    logSTR = logSTR & Chr(13)

    logSTR = logSTR & BuildValuesString("C", "18,19,20,21,22")
    logSTR = logSTR & BuildValuesString("C", "37,38,39,40,41,42,43,44")

    logSTR = logSTR & Chr(13)

    logSTR = logSTR & BuildValuesString("C", "18,19,20,21,22")
    logSTR = logSTR & BuildValuesString("C", "48,49,50,51,52,53,54,55")


Open "Z:\2016\Requests(Test)\" & ThisWorkbook.Name & ".csv" For Append As #My_filenumber
    Print #My_filenumber, logSTR
Close #My_filenumber

End Sub
如果在将数据导出到CSV文件后尝试直接运行PowerCLI脚本,则会遇到错误。错误显示:

导入Csv:成员“1”已存在

如果我手动打开CSV文件并在CSV文档中手动重新键入列名“name”并保存文件,则可以克服此错误。如果我简单地点击backspace并重新保存文档,不做任何更改,似乎也可以避免这个错误。这可能是什么原因造成的


我想避免这样做,是否可以做些什么来避免每次在运行PowerCLI脚本之前手动重新保存文档?

我手动打开CSV文件。。。并保存文件
-是否使用Excel打开?还是使用文本编辑器?Excel将在保存CSV文件时对其进行各种更改(使用显示的格式保存数值、可能在字符串周围放置引号、在日期字段中创建Y2K错误等),因此,您只需重新键入某些内容并不意味着生成的文件与原始文件没有太大的差异。您能否向我们展示在excel中打开CSV文件前后CSV文件的前2行?无论是在记事本中显示,还是作为获取内容的结果?@YowE3K,它都会在保存为CSV后使用Excel打开。我也用记事本打开了它,内容似乎是正确的-没有引号或任何不合适的地方。@mikegaruciopowercli在重新保存CSV文件之前:Desktop:\>获取内容“C:\Users\PROD\u VMRequ estTEST.xlsx.CSV”Srv。说明,电子邮件,环境,保护。级别、Metro?、虚拟机、名称、群集、VLAN、NumCPU、内存yGB、C#U系统、D#U Homevg、应用程序电子健康、CETS、,email@emailaddress.com,Dev/QC,Protected,Metro-Enabled,1,Test1.Dev,vSphere 5.5 RND,363,1,8,30,45,150,所以看起来有一些奇怪的尾随逗号和空格,但没有什么可以阻止导入。我最好的猜测是powershell期望的和vbs输出的编码之间的差异。您可以使用检查编码,也可以在导入时尝试
-encoding
参数的所有可能值。也不确定是否有意用于测试,但您需要确保将结果分配给
$CSVFile
的导入未被注释(另一个导入未执行任何操作)
我手动打开CSV文件。。。并保存文件
-是否使用Excel打开?还是使用文本编辑器?Excel将在保存CSV文件时对其进行各种更改(使用显示的格式保存数值、可能在字符串周围放置引号、在日期字段中创建Y2K错误等),因此,您只需重新键入某些内容并不意味着生成的文件与原始文件没有太大的差异。您能否向我们展示在excel中打开CSV文件前后CSV文件的前2行?无论是在记事本中显示,还是作为获取内容的结果?@YowE3K,它都会在保存为CSV后使用Excel打开。我也用记事本打开了它,内容似乎是正确的-没有引号或任何不合适的地方。@mikegaruciopowercli在重新保存CSV文件之前:Desktop:\>获取内容“C:\Users\PROD\u VMRequ estTEST.xlsx.CSV”Srv。说明,电子邮件,环境,保护。级别、Metro?、虚拟机、名称、群集、VLAN、NumCPU、内存yGB、C#U系统、D#U Homevg、应用程序电子健康、CETS、,email@emailaddress.com,Dev/QC,Protected,Metro-Enabled,1,Test1.Dev,vSphere 5.5 RND,363,1,8,30,45,150,所以看起来有一些奇怪的尾随逗号和空格,但没有什么可以阻止导入。我最好的猜测是powershell期望的和vbs输出的编码之间的差异。您可以使用检查编码,也可以在导入时尝试
-encoding
参数的所有可能值。也不确定是否有意进行测试,但您需要确保将结果分配给
$CSVFile
的导入未被注释(另一个导入未执行任何操作)
# Specify vCenter Server, vCenter Server username and vCenter Server user password
 write-host “Please specify vCenter Server and enter credentials” -foreground green
 $vc = read-Host "Connect to which vCenter Server?"
 write-host “Connecting to vCenter Server $vc” -foreground green

 $CSVPath = "$ScriptRoot\PROD_VMRequestTEST.xlsx.csv"    

 Connect-VIServer -Server $vc

 #$CSVFile = Import-Csv -Path $CSVPath

 Import-Csv -Path $CSVPath

 # Specify vCenter Server Virtual Machine & Templates folder
 $Folder = “Discovered virtual machine”
#
# Specify the vSphere Cluster

$Cluster = $_.Cluster

$esx = Get-Cluster $Cluster | Get-VMHost -State connected

Import-Csv -Path $CSVPath | %{

  Write-Host “Creation of VM $($_.Name) initiated”  -ForegroundColor green

  New-VM -Name $_.Name -VMHost ($esx | Get-Random) -Location $Folder

  Write-Host "Designating VLAN - '$($_.VLAN)'" -ForegroundColor green

  $VMhost = Get-vmhost $_.VMHost  
  $PortGroup = Get-VirtualPortgroup -name $_.VLAN -VMhost $VMhost  

  Write-Host "Power On of the VM $($_.Name)initiated" -ForegroundColor green

  Start-VM -VM $_.Name-confirm:$false -RunAsync

}