当我运行此脚本时(来自.bat文件):
set var1=true
if "%var1%"=="true" (
set var2=myvalue
echo %var2%
)
Run Code Online (Sandbox Code Playgroud)
我总是得到:
ECHO is on.
Run Code Online (Sandbox Code Playgroud)
意思是var2变量没有真正设置.谁能帮助我理解为什么?
我正在玩cmd.exe,但在它的帮助下我没有找到任何信息,如何定义数组.
我发现,如何定义简单变量:
set a=10
echo %a%
Run Code Online (Sandbox Code Playgroud)
但是,我想创建数组,链表等...
那么,它能否在cmd.exe中使用(我的意思是:cmd.exe中是否存在任何数组关键字?)
我想实现一些算法:
等等...
所以,我也想知道,Cmd.exe是否有引用或实例,结构等?
导致其帮助不完整:/?
可以通过图灵机定义将Cmd.exe定义为完整吗?(图灵完成)
有人可以给我一个例子,说明批处理脚本在有或没有延迟扩展的情况下会有不同的行为吗?您是否有任何不希望使用延迟扩展的情况?谢谢.
我一直在努力尝试在这个批处理文件中获得正确的语法,我无法弄清楚为什么有些东西不起作用.
i每次执行此变量时,变量都不会增加.strc似乎没有连接.这是我的代码:
set i=0
set "strc=concat:"
for %%f in (*.mp4) do (
set /a i+=1
set "str=intermediate%i%.ts"
set strc="%strc% %str%|"
ffmpeg -i "%%f" -c copy -bsf:v h264_mp4toannexb -f mpegts "%str%"
)
set strc="%strc:-1%"
ffmpeg -i "%strc%" -c copy -bsf:a aac_adtstoasc Output.mp4
Run Code Online (Sandbox Code Playgroud) 我稍后尝试访问TOMCAT_VER的值,但它显示为空字符串.
if exist "%_REALPATH%\tomcat-%TOMCAT_VER2%" (
set CATALINA_HOME=%_REALPATH%\tomcat-%TOMCAT_VER2%
set TOMCAT_VER=%TOMCAT_VER2%
echo "%TOMCAT_VER%"
) else if exist "%TOMCAT_VER2%" (
set CATALINA_HOME="%TOMCAT_VER2%"
set TOMCAT_VER="%TOMCAT_VER2%"
echo "%TOMCAT_VER%"
)
Run Code Online (Sandbox Code Playgroud)
为了进一步调试,我在它设置的下方插入了一个echo语句,但它似乎不起作用.在禁用echo off的情况下,我可以看到显示这些变量设置的语句,但我似乎无法将它们打印出来.
为什么字符串操作在if语句中内联工作而不使用延迟扩展变量 - 否则失败.例如:
set test=testString
if %test:~0,4%==test echo Success
Run Code Online (Sandbox Code Playgroud)
这工作正常; 回来Success.但是,如果我执行以下操作:
setLocal enableDelayedExpansion
set test=testString
if !test:~0,4!==test echo Success
Run Code Online (Sandbox Code Playgroud)
我收到错误 - 4!==test was unexpected at this time.
显然你可以通过在if语句中set comp=!test:~0,4!使用!comp!变量来做到这一点.
如果我运行批处理文件
setlocal
chdir ..
Run Code Online (Sandbox Code Playgroud)
目录未更改,但如果我运行
setlocal
endlocal
chdir ..
Run Code Online (Sandbox Code Playgroud)
它正常工作.这必须与setlocal完全一致.但是,当您阅读setlocal的定义时,并不完全明显,这与环境变量的显示方式有关.我希望这是一个很好的机会来解释setlocal实际上做了什么以及为什么它干扰了chdir.
我需要一个批处理脚本来调用
SetEnvironmentVariableIfNotSet.bat environment_variable_name <value>
Run Code Online (Sandbox Code Playgroud)
从另一个脚本或命令行。
我绝不是 Windows 批处理脚本方面的专家,但通过反复试验并将不同的东西拼凑在一起,到目前为止我已经想出了这个:
@setlocal EnableDelayedExpansion
@if "!%1!"=="" (
echo '%1' undefined. Defining with value
echo %2
endlocal DisableDelayedExpansion
goto :define_variable
) else (
echo '%1' already defined with value
echo !%1!
endlocal DisableDelayedExpansion
goto :eof
)
:define_variable
@set "%1=%2"
Run Code Online (Sandbox Code Playgroud)
当被调用时,做我需要的事情:
C:\>call DefEnvVarIfNotDef.bat ASD "C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\devenv.exe"
'ASD' undefined. Defining with value
"C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\devenv.exe"
C:\>echo %ASD%
"C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\devenv.exe"
Run Code Online (Sandbox Code Playgroud)
在这里寻求更好/最佳的解决方案。这对我来说确实很难看。
我想知道为什么这段代码不能按预期工作:
@ECHO off
SET S1=HELLO
SETLOCAL EnableDelayedExpansion
SET S2=!S1! WORLD^^!
ECHO !S2!
ENDLOCAL & SET S1=!S2!
ECHO %S1%
PAUSE
Run Code Online (Sandbox Code Playgroud)
输出:
HELLO WORLD!
!S2!
Run Code Online (Sandbox Code Playgroud)
预期产量:
HELLO WORLD!
HELLO WORLD!
Run Code Online (Sandbox Code Playgroud)
谢谢.
我已经编写了一个.bat文件来首先运行一个程序,如果它正确完成,我运行另一个程序并检查它的返回值。
first-program.exe
IF "%ERRORLEVEL%"=="0" (
second-program.exe
IF "%ERRORLEVEL%"=="0" (
ECHO OK
) ELSE (
ECHO NOK
)
)
Run Code Online (Sandbox Code Playgroud)
但是,第二个%ERRORLEVEL%始终等于第一个,它不会设置为 的返回值second-program.exe。
batch-file ×10
cmd ×7
windows ×4
arrays ×1
chdir ×1
console ×1
errorlevel ×1
if-statement ×1
shell ×1
string ×1