如果使用插入符号“call”来分割参数,则不能在函数中使用“pause”

时间:2017-07-18 04:51:45

标签: batch-file

我无法在Windows 10上的.bat文件中使用它。控制台打开并退出跳过功能中的暂停。

@echo off

:: SETLOCAL EnableExtensions EnableDelayedExpansion

echo.
call :test "param1",<nul ^
"param2",<nul ^
"param3",<nul ^
"param4"

exit

:test
cls

echo "%~1"
echo "%~2"
echo "%~3"
echo "%~4"

echo.
echo This pause doesn't work with caret to split parameters ↓
pause

exit /b

但这会显示2暂停

@echo off

:: SETLOCAL EnableExtensions EnableDelayedExpansion

echo.
call :test "param1",<nul ^
"param2",<nul ^
"param3",<nul ^
"param4"

pause
exit

:test
cls

echo "%~1"
echo "%~2"
echo "%~3"
echo "%~4"

echo.
echo This pause doesn't work with caret to split parameters ↓
pause

exit /b

任何想法是否有可能使第一个代码保持插入符号分割参数?

是的,如果我删除<nul,则暂停功能将起作用,但我无法获得param3param4。我走到了尽头。

编辑:最好的解决方案是避免插入符号。感谢您的启示,证实了我的想法。

2 个答案:

答案 0 :(得分:4)

call :test "param1",<nul ^
"param2",<nul ^
"param3",<nul ^
"param4"

相同
call :test "param1","param2","param3","param4" 0<nul

这意味着:调用 :test子例程

  • 提供四个参数"param1","param2","param3","param4"
  • 从类似文件的设备nul中读取所有键盘输入

因此,pause子例程中的所有:test都会立即恢复,因为它来自nul

阅读Redirection

command < filename        Type a text file and pass the text to command

数字句柄:

STDIN  = 0  Keyboard input
STDOUT = 1  Text output
STDERR = 2  Error text output
UNDEFINED = 3-9

答案 1 :(得分:0)

当您向呼叫添加<nul ^时,它有两种不同的效果。

1)它会抑制pause等待,因为pause接受nul的输入 2)<nul ^稍微更改一行继续,它避免了下一行中第一个字符的转义。

顺便说一下。您不需要任何逗号来分割调用中的参数。

您可以简单地使用(请注意行中的第一个空格)

call :test "param1" ^
 "param2" ^
 "param3" ^
 "param4"

如果您确实想要使用redirect caret行为,可以将重定向从<nul更改为2>nul
但是你输掉 stderr输出

call :test "param1" 2>nul ^
"param2" 2>nul ^
"param3" 2>nul ^
"param4"