如何将批处理文件的输出重定向到另一个批处理文件?

raj*_*esh 1 batch-file

我想创建一个实用程序批处理文件,该文件将由客户端批处理文件使用。实用程序批处理文件将创建结果并将重定向为输出。客户端批处理文件将调用 utility.bat 并将结果保存在变量中。

我编写的Utility.bat代码如下

echo off
set result="some info"
echo %result%
rem output
Run Code Online (Sandbox Code Playgroud)

我不确定如何将结果作为输出传递的语法

client.batch的代码如下

@echo off 
set var1=%Utility.bat%
echo "%var1%"
Run Code Online (Sandbox Code Playgroud)

需要语法帮助才能将结果作为输出传递。

我在网上找到了许多将结果传递到文本文件(日志记录)的答案,但这不是我的要求。

dbe*_*ham 5

您需要使用 CALL 让一个批处理文件调用另一个批处理文件。您可以将变量的名称作为参数传递,并且 CALLed 脚本可以将结果存储在那里。

实用程序.bat

@echo off
set "result=some info"
set "%~1=%result%"
Run Code Online (Sandbox Code Playgroud)

客户端.bat

@echo off
call utility var1
echo var1=%var1%
Run Code Online (Sandbox Code Playgroud)

如果 Utility 使用 SETLOCAL,则需要一种机制来跨 ENDLOCAL 屏障传递值。只需要更改实用程序:

实用程序.bat

@echo off
setlocal
set "result=some info"
endlocal & set "%~1=%result%"
Run Code Online (Sandbox Code Playgroud)

如果返回值可能包含引号和有害字符,则需要使用不同的方法。

实用程序.bat

@echo off
setlocal enableDelayedExpansion
set result="Quoted <^&|>" and unquoted ^<^^^&^|^>
for /f delims^=^ eol^= %%A in ("!result!") do endlocal & set "%~1=%%A"
Run Code Online (Sandbox Code Playgroud)

上面的最后一个代码支持除回车符(0x0D)和换行符(0x0A)之外的所有字符,并且如果!调用者(client.bat)启用了延迟扩展,则如果返回值包含,则会出现问题。有一个解决方案可以消除这些限制,但它很复杂。请参阅/sf/answers/578056601/