调用 VBScript 时在批处理脚本中设置参数

Posted

技术标签:

【中文标题】调用 VBScript 时在批处理脚本中设置参数【英文标题】:Setting parameters in batch script while calling VBScript 【发布时间】:2020-06-05 20:56:30 【问题描述】:

我有一个 bat 文件,它调用转换文件编码的 vbscript。 在通过设置文件的一部分运行代码时,它可以正常工作,但是当我尝试将多个文件作为参数传递时,我收到以下错误: microsoft vbscript 运行时错误:无效或不合格的引用

你可以在 run.cmd 下面看到我的批处理脚本:

@Echo off
SET CHEMINDAT = C:\Users\myuser\Desktop\TRY\DATA_TY\
SET CHEMINTMP = C:\Users\myuser\Desktop\TRY\TMP\

echo %DATE% %TIME% Debut de traitement.

dir %CHEMINDAT%* /a:-d/b > %CHEMINTMP%-liste.txt 2

FOR /F "eol=; tokens=1 delims=, " %%i in (%CHEMINTMP%-liste.txt) do (

echo %%i > %CHEMINTMP%Fichier_en_cours.txt
echo %DATE% %TIME% Traitement du fichier : %%i

cscript //NoLogo C:\Users\myuser\Desktop\TRY\\Scripts\unix2dos_7.vbs %%i

)
pause
exit /b 1

您将在下面找到我的 VBScript 'unix2dos_7.vbs':

Const adTypeBinary          = 1
Const adTypeText            = 2
Const adSaveCreateNotExist  = 1
Const adSaveCreateOverWrite = 2
Const adWriteLine = 1
Const adReadLine = -2
Const adLF = 10
Const adCR = 13
Const adCRLF = -1
Set streamUTF8 = CreateObject("ADODB.Stream")
Set streamASCII = CreateObject("ADODB.Stream")

Dim args
set args = Wscript.arguments
strOutOne= args(0)

streamUTF8.Open
streamUTF8.Type = adTypeText
streamUTF8.LineSeparator = adCRLF
streamUTF8.Charset = "UTF-8"
streamUTF8.LoadFromFile strOutOne

streamASCII.Open
streamASCII.Type = adTypeText
streamASCII.LineSeparator = adCRLF
streamASCII.CharSet = "us-ascii"

Do Until streamUTF8.EOS
streamASCII.WriteText streamUTF8.ReadText(adReadLine), adWriteLine
Loop
streamASCII.SaveToFile "myfileConverted.txt", adSaveCreateOverWrite

我还想用新文件替换原始文件,而不是创建一个新文件“myfileConverted.txt”。这样我就没有两次相同的文档了

有人可以帮忙吗?

提前致谢

【问题讨论】:

我要问的第一个问题是,为什么?我还建议你看看这个previous question,它是cmets,它是答案,它利用powershell,而不是vbscript 如果您正在处理长文件名,那么您可能需要在调用 .vbs 时在 .cmd 文件中用双引号 (") 引用 (") %%i;否则,您的 .vbs 只会得到路径的第一部分。另外,在 TRY 之后去掉你的双反斜杠 (\)。或者,你可能需要调用 32 位版本的 cscript.exe。最后,一定要.Close你的 ADODB。 .vbs 脚本中的流对象。C:\Windows\SysWOW64\cscript.exe //NoLogo C:\Users\myuser\Desktop\TRY\Scripts\unix2dos_7.vbs "%%i" 【参考方案1】:

我能够做我想做的事,你会在下面看到代码: 批号:

@Echo off
SET CHEMINDAT = C:\Desktop\try\script_try_2\data\
SET CHEMINTMP = C:\\Desktop\try\TMP\

echo %DATE% %TIME% Debut de traitement.
dir %CHEMINDAT%* /a:-d/b > %CHEMINTMP%-liste.txt 

FOR /F "eol=; tokens=1 delims=, " %%i in (%CHEMINTMP%-liste.txt) do (

echo %%i > %CHEMINTMP%Fichier_en_cours.txt
echo %DATE% %TIME% Traitement du fichier : %%i


cscript //NoLogo C:\Desktop\try\script_try_2\unix2dos_7_2.vbs "%%i"
)

pause
exit /b 1

我的 vbScript:

Const adTypeBinary          = 1
Const adTypeText            = 2
Const adSaveCreateNotExist  = 1
Const adSaveCreateOverWrite = 2
Const adWriteLine = 1
Const adReadLine = -2
Const adLF = 10
Const adCR = 13
Const adCRLF = -1
Set streamUTF8 = CreateObject("ADODB.Stream")
Set streamASCII = CreateObject("ADODB.Stream")

set args = Wscript.arguments
strOutOne= args(0)

streamUTF8.Open
streamUTF8.Type = adTypeText
streamUTF8.LineSeparator = adCRLF
streamUTF8.Charset = "UTF-8"
streamUTF8.LoadFromFile = strOutOne

streamASCII.Open
streamASCII.Type = adTypeText
streamASCII.LineSeparator = adCRLF
streamASCII.CharSet = "us-ascii"

Do Until streamUTF8.EOS
streamASCII.WriteText streamUTF8.ReadText(adReadLine), adWriteLine
Loop
streamASCII.SaveToFile(strOutOne), adSaveCreateOverWrite

【讨论】:

以上是关于调用 VBScript 时在批处理脚本中设置参数的主要内容,如果未能解决你的问题,请参考以下文章

在脚本中设置 MSMQ 队列的权限

vbscript 在VBScript中设置,获取和清除ClipBoard文本。

如何在配置文件中定义的 PowerShell 脚本中设置环境变量?

如何从 TeamCity 构建配置中设置 PowerShell 开关参数

在 Unix shell 脚本中设置退出代码

如何在页面加载时在 HtmlEditorExtender 中设置内容