将 VBS 嵌入 PowerShell
Embed VBS into PowerShell
我们这里有一个应用程序可以将数据转储到 CSV 文件中,然后供另一个脚本使用。在应用程序的前一次迭代中,其中一列是 "user_name" 并且包含用户 ID。它仍然存在,但它现在将“_company”附加到用户 ID,因此现在列中的用户 ID "tim" 变成了 "tim_company"。我们正在寻求剥离公司,我认为最好的方法是将一些 VB 作为函数嵌入到现有脚本中,就像这个网站建议的那样:http://www.out-web.net/?p=130.
这是我尝试添加的内容:
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 只是 remove/replace 数据,如下所示:
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中调用VB脚本。我读到这可能是一个丢失的 DLL,但我更有可能相信我没有调用我应该调用的东西。有什么想法吗?
我和其他人一样,我认为你在不必要地使事情复杂化。如果您只想 剥离公司 然后 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”这样的帐户)。使用 $_
将更新后的记录推回管道并再次推回原始文件。请像我一样先用虚拟数据测试一下。
真正的根本原因是因为 MSScriptControl.ScriptControl
是一个 32 位库,您很可能 运行 在 64 位 shell 中安装您的 PowerShell 脚本。这行不通,您不能将 32 位二进制文件加载到 64 位进程中,反之亦然。
您需要在 32 位 shell 中执行 PowerShell 脚本才能让 MSScriptControl.ScriptControl
实例化。您可以通过以下两种方式之一执行此操作:
从命令行使用:
c:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe .\yourscript.ps1
来自 GUI:
但是,你做的事情真的很麻烦,我会听取 Matt 的建议,用 PowerShell 重写你的东西,在长期 运行.[=14 中调试和维护会更容易=]
我们这里有一个应用程序可以将数据转储到 CSV 文件中,然后供另一个脚本使用。在应用程序的前一次迭代中,其中一列是 "user_name" 并且包含用户 ID。它仍然存在,但它现在将“_company”附加到用户 ID,因此现在列中的用户 ID "tim" 变成了 "tim_company"。我们正在寻求剥离公司,我认为最好的方法是将一些 VB 作为函数嵌入到现有脚本中,就像这个网站建议的那样:http://www.out-web.net/?p=130.
这是我尝试添加的内容:
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 只是 remove/replace 数据,如下所示:
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中调用VB脚本。我读到这可能是一个丢失的 DLL,但我更有可能相信我没有调用我应该调用的东西。有什么想法吗?
我和其他人一样,我认为你在不必要地使事情复杂化。如果您只想 剥离公司 然后 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”这样的帐户)。使用 $_
将更新后的记录推回管道并再次推回原始文件。请像我一样先用虚拟数据测试一下。
真正的根本原因是因为 MSScriptControl.ScriptControl
是一个 32 位库,您很可能 运行 在 64 位 shell 中安装您的 PowerShell 脚本。这行不通,您不能将 32 位二进制文件加载到 64 位进程中,反之亦然。
您需要在 32 位 shell 中执行 PowerShell 脚本才能让 MSScriptControl.ScriptControl
实例化。您可以通过以下两种方式之一执行此操作:
从命令行使用:
c:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe .\yourscript.ps1
来自 GUI:
但是,你做的事情真的很麻烦,我会听取 Matt 的建议,用 PowerShell 重写你的东西,在长期 运行.[=14 中调试和维护会更容易=]