将VBS嵌入PowerShell

时间:2015-10-19 21:04:36

标签: powershell vbscript powershell-v2.0

我们在这里有一个将数据转储到CSV中的应用程序,然后由另一个脚本使用。在应用程序的上一次迭代中,其中一列是“user_name”并包含用户ID。它仍然存在,但它现在将“_company”附加到用户ID,因此代替用户ID“tim”,它现在是列中的“tim_company”。我们希望剥离公司,我认为最好的方法是将一些VB作为函数嵌入到现有脚本中,就像这个网站建议的那样:http://www.out-web.net/?p=130

这是我试图补充的内容:

.smaller {
    width : 100px;
}

.vbs只是删除/替换数据,如下所示:

function Load-VbsCode{
    param(
        $Code = $(throw "No VBS code specified.")
    )

    # Convert an array of multiple text lines to a string
    $vbsCode = [string]::Join("`n", $Code)

    $vbs = New-Object -ComObject 'MSScriptControl.ScriptControl'
    $vbs.Language = "VBScript"
    $vbs.AddCode($vbsCode)
    $vbs.CodeObject
}
# pass the entire vbs file to Load-VbsCode
$vbs = Load-VbsCode $(Get-Content .\ReplaceData.vbs)
# Ready to use the Removenavient function
$c = $vbs.RemoveData

我收到了这个错误:

Function Removedata
    Const FromValue = "_company"
    Const ToValue = ""

    Dim objExcel : Set objExcel = CreateObject("Excel.Application")
    'objExcel.Visible = True
    Set objWorkbook =  objExcel.Workbooks.Open("D:\Location\JunkData.csv")
    Dim objWorksheet : Set objWorksheet = objWorkbook.Worksheets(1)
    'Dim objRange : Set objRange = objWorksheet.UsedRange

    objWorksheet.Cells.Replace FromValue, ToValue

    objExcel.DisplayAlerts = False
    objExcel.Save
    objExcel.Quit
End Function

我不懂VB,我不知道如何在PS中调用VBScript。我读到这可能是一个丢失的DLL,但我更可能相信我没有打电话给我应该打电话。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

我和其他所有人在一起我觉得你不必要地使事情复杂化。如果您要做的只是剥离公司然后import-csv并循环以进行更改。

鉴于样本CSV保存在文件

user_name,first_name,last_name
lrivera0_company,Lawrence,Rivera
tlawrence1_company,Theresa,Lawrence
rboyd2_company,Roy,Boyd
cperry3_company,Christine,Perry
jmartin4_company,Jessica,Martin

针对它运行以下代码。

$filepath = "d:\temp\text.csv"
$toReplace = "_company"
(Import-Csv $filepath) | ForEach-Object{
    $_.User_Name = ($_.User_Name).Replace($toReplace,""); $_
} | Export-CSV $filepath -NoTypeInformation

这将把文件读作PowerShell对象。对于每条记录,我们通过删除“_company”来更新user_name(请注意,我希望您的帐户中没有帐户已经像“_company_company”)。使用$_将更新的记录推回管道,然后再将其推送到原始文件。请像我一样用虚拟数据测试这个。

答案 1 :(得分:3)

真正的根本原因是因为MSScriptControl.ScriptControl是一个32位库,并且您最有可能在64位shell中运行PowerShell脚本。这不起作用,你不能将32位二进制文​​件加载到64位进程中,反之亦然。

您需要在32位shell中执行PowerShell脚本才能使MSScriptControl.ScriptControl实例化。您可以通过以下两种方式之一完成此操作:

  1. 从命令行使用:

    c:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe .\yourscript.ps1
    
  2. 从GUI:

      

    https://technet.microsoft.com/en-us/library/hh847733.aspx

  3. 然而,你正在做的事情真的很麻烦,我会接受Matt的建议,并在PowerShell中重写你的东西,从长远来看,调试和维护会更容易。