从外部函数批返回字符串

时间:2018-05-12 09:37:15

标签: windows function batch-file

我有两个批处理文件。一个是主(调用者)文件,一个是函数。 该函数接受一个参数,做一些东西,然后我想将字符串返回给调用者(main.bat)。 %ERRORLEVEL%不是一个选项,因为它只能返回整数。

main.bat:
Option Explicit Public Sub TestingComparison() Const RUN_COUNT As Long = 4 Dim hTable As Object Dim aList As Object Dim i As Long, j As Long, k As Long, rowCount As Long Dim results() As Double Set hTable = CreateObject("System.Collections.HashTable") Set aList = CreateObject("System.Collections.ArrayList") Dim testSizes() testSizes = Array(100, 1000, 10000, 100000) ', 1000000) ReDim results(0 To RUN_COUNT * (UBound(testSizes) + 1) - 1, 0 To 4) Application.ScreenUpdating = False With ThisWorkbook.Worksheets("Sheet5") For i = LBound(testSizes) To UBound(testSizes) For k = 1 To RUN_COUNT For j = 1 To testSizes(i) hTable.Add j, 1 aList.Add 1 Next j Dim StartTime As Double, completionTime As Double StartTime = MicroTimer() For j = hTable.Count To 1 Step -1 hTable.Remove j Next j results(rowCount, 3) = Round(MicroTimer - StartTime, 3) results(rowCount, 0) = testSizes(i) results(rowCount, 1) = k StartTime = MicroTimer() For j = aList.Count - 1 To 0 Step -1 aList.Remove aList(j) Next j results(rowCount, 2) = Round(MicroTimer - StartTime, 3) hTable.Clear aList.Clear rowCount = rowCount + 1 Next k Next i .Range("A2").Resize(UBound(results, 1) + 1, UBound(results, 2)) = results End With Application.ScreenUpdating = True End Sub
function.bat:
call function.bat hello
[此处将字符串返回给CALLER文件的代码]
看起来像一个基本的操作,所以一定有办法。另外,我不喜欢用输出制作文件并在main.bat中读取它,因为我想让它作为一个易于使用的功能。

1 个答案:

答案 0 :(得分:1)

这两个批处理文件由同一个Windows命令处理器进程执行,因此共享所有环境变量。

<强> Main.bat:

@echo off
set "MyVariable="
call Function.bat hello
echo MyVariable=%MyVariable%

<强> Function.bat:

@echo off
rem Some code ...
set "MyVariable=%~1"

可能Function.bat因某种原因使用命令 SETLOCAL 。在这种情况下,在相应的 ENDLOCAL 之后,在命令 SETLOCAL 之后定义的所有环境变量以及对环境变量所做的所有修改都将丢失。 Windows命令处理器在退出执行批处理文件时隐式调用此命令,每个 SETLOCAL 尚未完成,并显式执行相应的 ENDLOCAL 。有关命令 SETLOCAL ENDLOCAL 的详细信息,请阅读this answer

必须在命令行中使用 ENDLOCAL 显式设置环境变量,并使用立即环境变量扩展将环境变量的值从当前环境变量列表传递到先前的环境变量列表

<强> Function.bat:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem Some code ...
set "MyVariable=%~1"
endlocal & set "MyVariable=%MyVariable%"

最后一个命令行首先由Windows命令解释器预处理到

endlocal   & set "MyVariable=hello"

因此预处理后的命令行不再包含任何变量引用。命令 ENDLOCAL 恢复先前的环境,导致删除环境变量MyVariable。但是在同一命令行中指定的第二个命令 SET 在恢复的环境中再次使用值hello设置此变量。

另见Single line with multiple commands using Windows batch file