2015-10-19 105 views
2

我们有一个应用程序将数据转储为CSV,然后由其他脚本使用。在应用程序的上一次迭代中,其中一列是“user_name”并包含用户标识。这仍然存在,但它现在将“_company”附加到用户标识,所以不是用户标识“tim”,而是列中的“tim_company”。我们正在考虑剥离公司,我认为最好的办法是将一些VB嵌入到现有的脚本中,就像本站建议的那样:http://www.out-web.net/?p=130将VBS嵌入到PowerShell中

这就是我试图添加:

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 

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

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 

我得到这个错误:

New-Object : Retrieving the COM class factory for component with CLSID 
{0E59F1D5-1FBE-11D0-8FF2-00A0D10038BC} failed due to the following error: 
80040154. 
At D:\Location\Remove__company_from_CSV.ps1:11 char:22 
+  $vbs = New-Object <<<< -ComObject 'MSScriptControl.ScriptControl' 
    + CategoryInfo   : ResourceUnavailable: (:) [New-Object], COMException 
    + FullyQualifiedErrorId : NoCOMClassIdentified,Microsoft.PowerShell.Commands.NewObjectCommand 

Property 'Language' cannot be found on this object; make sure it exists and 
is settable. 
At D:\Location\Remove__company_from_CSV.ps1:12 char:10 
+  $vbs. <<<< Language = "VBScript" 
    + CategoryInfo   : InvalidOperation: (Language:String) [], RuntimeException 
    + FullyQualifiedErrorId : PropertyNotFound 

You cannot call a method on a null-valued expression. 
At D:\Location\Remove__company_from_CSV.ps1:13 char:17 
+  $vbs.AddCode <<<< ($vbsCode) 
    + CategoryInfo   : InvalidOperation: (AddCode:String) [], RuntimeException 
    + FullyQualifiedErrorId : InvokeMethodOnNull 

我不知道VB,我不知道如何在PS中调用VBScript。我读过这可能是一个缺少的DLL,但我更可能相信我没有调用我应该打电话的东西。有任何想法吗?

+3

我认为这会更有意义,只是在PowerShell中做到这一点?下面是一个链接,向您展示如何在文本文件上进行查找和替换:http://blogs.technet。COM/B/heyscriptingguy /存档/ 2008/01/17 /何灿我使用 - 窗口PowerShell的更换的字符-IN-A-文本file.aspx –

+0

使用VB是technicaly可行的,但它是真的不是一个好主意。 – JPBlanc

+0

谢谢。我会立即研究这个,所以我最大限度地减少了我在生活中浪费多少时间。 – Nate

回答

3

我与其他人一样,我认为你是不必要的复杂的事情。如果您要做的只是,请将公司从中除去,然后import-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 

对其运行下面的代码示例CSV。

$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”一样)。使用$_将更新的记录推回到管道中并再次输出到原始文件。请先像我这样用虚拟数据来测试它。

+0

我向你明显的天才低头,先生。我认为VB是要走的路,因为这个CSV在某些日子里可能会高达80MB,但是你的方法在我的地方没有,所以再次感谢。 – Nate

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

但是,你在做什么这样做非常麻烦,我会采取马特的建议,并在PowerShell中重写你的东西,从长远来看,调试和维护会更容易。

+0

感谢您的协助。我会研究这个。 – Nate