将多行字符串传递给批处理文件

时间:2015-02-06 15:20:56

标签: shell batch-file vbscript

我将多行字符串从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

2 个答案:

答案 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删除

但是,当使用次优内容时,仍然存在问题。