我将多行字符串从vbscript传递到批处理文件。但是,当我尝试从批处理文件中获取整个字符串时,它只接收第一行。如何让批处理文件知道读取整个字符串,而不是停留在换行符上。
输入:
C:\ ComponentA
C:\以componentB
C:\ ComponentC
的VBScript:
multstring = "C:\Component_A" + Chr(13) + Chr(10) + "C:\ComponentB" +
Chr(13) + Chr(10) + "C:\ComponentC" + Chr(13) + Chr(10)
script_path = "runscript.bat """ + multstring + """
Shell(script_path)
批次:
set "scriptargs=%~1"
echo "%scriptargs%"
setlocal enableDelayedExpansion
echo !scriptargs!
我正在获得的输出:
C:\ ComponentA
输出通缉:
C:\ ComponentA
C:\以componentB
C:\ ComponentC
答案 0 :(得分:2)
多行字符串不能通过命令行参数传递给批处理文件,但新行可以包含在环境变量中。
VBS可以使用换行符定义环境变量,然后您调用的批处理脚本可以通过使用延迟扩展来读取和显示该值。
<强> test.vbs 强>
set wshShell = CreateObject("WScript.Shell")
set Env=wshShell.Environment("PROCESS")
multstring="C:\Component_A" + Chr(13) + Chr(10) + "C:\ComponentB" + _
Chr(13) + Chr(10) + "C:\ComponentC" + Chr(13) + Chr(10)
Env("arg1") = multstring
script_path = "runscript.bat arg1"
wshShell.Run script_path
<强> runscript.bat 强>
@echo off
setlocal enableDelayedExpansion
echo !%1!
pause
请注意,这适用于VBS调用的批处理脚本,因为新的批处理脚本会继承VBS环境的副本。
如果批处理脚本调用VBS,则VBS无法通过环境变量将值传递回调用方,因为一旦VBS结束,VBS环境就会丢失。
答案 1 :(得分:0)
正如dbenham所提到的,通过引用传递多行字符串是一个好主意。
但如果你真的需要通过值传递它们,这也是可能的。
问题是访问它们。
以下是How to receive even the strangest command line parameters?的改编版。
@echo off
setlocal DisableExtensions DisableDelayedExpansion
REM Write the complete parameter to a temp file
@echo on
@(for %%A in (%%A) do (
@goto :break
REM # %1 #
REM
)) > param.tmp
:break
@echo off
REM receive all lines from the temp file and store them in an array
setlocal EnableExtensions
set cnt=0
for /F "skip=3 delims=" %%a in (param.tmp) DO (
set /a cnt+=1
setlocal EnableDelayedExpansion
for /F %%n in ( "!cnt!" ) do (
setlocal DisableDelayedExpansion
set "param%%n=%%a"
)
)
setlocal EnableDelayedExpansion
set \n=^
REM Build the \n variable with a linefeed character, the two empty lines are required
REM Build from the array a single parameter
set /a cnt-=2
set "param1=!param1:~6!" REM Remove the 'REM #' from the first line
set "param%cnt%=!param%cnt%:~0,-3!" REM Remove the trailing '#' from the last line
set "param="
for /L %%n in (1 1 !cnt!) do (
if %%n GTR 1 set "param=!param!!\n!"
set "param=!param!!param%%n:~1!"
)
echo The param is: '!param!'
来自控制台的示例调用(需要空行!):
test.bat ^"hello^
Line2^
Line3"
无法访问回车符,因为它们始终由cmd.exe删除
但是,当使用次优内容时,仍然存在问题。