使用“=&rem”按输入变量批量操作字符串
Batch Manipulating String by Input Variable Using "=&rem."
在这里使用 Server 2016 进行简单的批处理文件编程(目前)。
我有一个我认为很简单的问题,只是我现在没有看到摆在我面前的可行解决方案。为了简单起见,我将把我的请求限制在一个测试场景中。我想要做的是 trim 一个从右边开始的字符串,直到它以“_%year%-”格式到达当前年份,其中年份确实来自其他地方的变量,但在我的示例中设置为静态.我 运行 遇到的问题是指我拥有的代码中的一个变量。
这是一个不在 rem 行上使用变量的工作示例,并给出了 "Machined_Cam-2286:"
所需的输出
@ECHO OFF
SETLOCAL DisableDelayedExpansion
set "testString=Machined_Cam-2286_2017-09-08.slddrw - SOLIDWORKS"
set "systemYear=2017"
set "yearModified=_%systemYear%-"
echo "%testString%" | find "%yearModified%" >NUL || goto :EOF
set testString=%testString:_2017-=&rem.%
echo %testString%
pause
您可以看到“_2017-”硬编码在第 10 行。我希望在 rem 行上以纯逻辑的方式具体执行以下操作:
set testString=%testString:%yearModified%=&rem.%
由于此命令内联修改 testString 的方式,因此很难将变量注入其中。到目前为止,我已经尝试了转义和扩展设置的大量组合来获取变量,但没有成功。我还尝试 "build" 命令作为字符串并尝试调用它并将输出通过管道传递给变量:
@ECHO OFF
SETLOCAL DisableDelayedExpansion
set "testString=Machined_Cam-2286_2017-09-08.slddrw - SOLIDWORKS"
set "systemYear=2017"
set "yearModified=_%systemYear%-"
echo "%testString%" | find "%yearModified%" >NUL || goto :EOF
set "callCMD=%%testString:%yearModified%=^&rem.%%"
call %callCMD% > %testString%
echo %testString%
pause
这看起来是一个很简单的问题,但我对DOS下的字符串操作缺乏理解是显而易见的。按照目前的情况,脚本的其余部分 运行 与“_2017-”硬编码完美结合。消除那一点维护会很好。
如有任何帮助或指导,我们将不胜感激。
谢谢。
您正在尝试使用变量的内容来控制您调用的内容
尝试使用临时文件 -
echo %%testString:%yearModified%=^&rem.%%" > temp.bat
call temp.bat > %testString%
您需要延迟此类操作的扩展,所以启用它。
- 我建议先获取字符串的剩余部分
- 并将其从原始字符串中删除。
@ECHO OFF
SETLOCAL EnableDelayedExpansion
set "testString=Machined_Cam-2286_2017-09-08.slddrw - SOLIDWORKS"
set "systemYear=2017"
set "yearModified=_%systemYear%-"
echo "%testString%" | find "%yearModified%" >NUL || goto :EOF
set tempString=!testString:*%yearModified%=!
set testString=!testString:%yearModified%%tempstring%=!
echo %testString%
pause
示例输出:
Machined_Cam-2286
我可以给你看另一种拆分方法。将 "Delimiterstring" 替换为适当的分隔符并使用 for
进行拆分(for
使用单字母分隔符)。启用延迟扩展会有所帮助,但不是必需的。当您明确禁用它时(您可能有自己的理由),我会向您展示:
@echo off
set "TestString=Machined_Cam-2286_2017-09-08.slddrw - SOLIDWORKS"
set "CutHere=_2017"
setlocal enabledelayedexpansion
for /f "delims=§" %%a in ("!TestString:%CutHere%=§!") do set Result=%%~a
echo enabled: %Result%
endlocal
setlocal disabledelayedexpansion
for /f "delims=§" %%a in ('call echo "%%TestString:%CutHere%=§%%"') do set Result=%%~a
echo disabled: %Result%
endlocal
请确定,您使用的定界符(§
此处)肯定不会出现在您的字符串中。
@echo off
setlocal EnableDelayedExpansion
set "testString=Machined_Cam-2286_2017-09-08.slddrw - SOLIDWORKS"
set "systemYear=2017"
set "yearModified=_%systemYear%-"
echo "%testString%" | find "%yearModified%" >NUL || goto :EOF
set testString=!testString:%yearModified%=^&rem.!
echo %testString%
pause
你应该在延迟扩展模式下使用胡萝卜(^)。
在这里使用 Server 2016 进行简单的批处理文件编程(目前)。
我有一个我认为很简单的问题,只是我现在没有看到摆在我面前的可行解决方案。为了简单起见,我将把我的请求限制在一个测试场景中。我想要做的是 trim 一个从右边开始的字符串,直到它以“_%year%-”格式到达当前年份,其中年份确实来自其他地方的变量,但在我的示例中设置为静态.我 运行 遇到的问题是指我拥有的代码中的一个变量。
这是一个不在 rem 行上使用变量的工作示例,并给出了 "Machined_Cam-2286:"
所需的输出@ECHO OFF
SETLOCAL DisableDelayedExpansion
set "testString=Machined_Cam-2286_2017-09-08.slddrw - SOLIDWORKS"
set "systemYear=2017"
set "yearModified=_%systemYear%-"
echo "%testString%" | find "%yearModified%" >NUL || goto :EOF
set testString=%testString:_2017-=&rem.%
echo %testString%
pause
您可以看到“_2017-”硬编码在第 10 行。我希望在 rem 行上以纯逻辑的方式具体执行以下操作:
set testString=%testString:%yearModified%=&rem.%
由于此命令内联修改 testString 的方式,因此很难将变量注入其中。到目前为止,我已经尝试了转义和扩展设置的大量组合来获取变量,但没有成功。我还尝试 "build" 命令作为字符串并尝试调用它并将输出通过管道传递给变量:
@ECHO OFF
SETLOCAL DisableDelayedExpansion
set "testString=Machined_Cam-2286_2017-09-08.slddrw - SOLIDWORKS"
set "systemYear=2017"
set "yearModified=_%systemYear%-"
echo "%testString%" | find "%yearModified%" >NUL || goto :EOF
set "callCMD=%%testString:%yearModified%=^&rem.%%"
call %callCMD% > %testString%
echo %testString%
pause
这看起来是一个很简单的问题,但我对DOS下的字符串操作缺乏理解是显而易见的。按照目前的情况,脚本的其余部分 运行 与“_2017-”硬编码完美结合。消除那一点维护会很好。
如有任何帮助或指导,我们将不胜感激。
谢谢。
您正在尝试使用变量的内容来控制您调用的内容
尝试使用临时文件 -
echo %%testString:%yearModified%=^&rem.%%" > temp.bat
call temp.bat > %testString%
您需要延迟此类操作的扩展,所以启用它。
- 我建议先获取字符串的剩余部分
- 并将其从原始字符串中删除。
@ECHO OFF
SETLOCAL EnableDelayedExpansion
set "testString=Machined_Cam-2286_2017-09-08.slddrw - SOLIDWORKS"
set "systemYear=2017"
set "yearModified=_%systemYear%-"
echo "%testString%" | find "%yearModified%" >NUL || goto :EOF
set tempString=!testString:*%yearModified%=!
set testString=!testString:%yearModified%%tempstring%=!
echo %testString%
pause
示例输出:
Machined_Cam-2286
我可以给你看另一种拆分方法。将 "Delimiterstring" 替换为适当的分隔符并使用 for
进行拆分(for
使用单字母分隔符)。启用延迟扩展会有所帮助,但不是必需的。当您明确禁用它时(您可能有自己的理由),我会向您展示:
@echo off
set "TestString=Machined_Cam-2286_2017-09-08.slddrw - SOLIDWORKS"
set "CutHere=_2017"
setlocal enabledelayedexpansion
for /f "delims=§" %%a in ("!TestString:%CutHere%=§!") do set Result=%%~a
echo enabled: %Result%
endlocal
setlocal disabledelayedexpansion
for /f "delims=§" %%a in ('call echo "%%TestString:%CutHere%=§%%"') do set Result=%%~a
echo disabled: %Result%
endlocal
请确定,您使用的定界符(§
此处)肯定不会出现在您的字符串中。
@echo off
setlocal EnableDelayedExpansion
set "testString=Machined_Cam-2286_2017-09-08.slddrw - SOLIDWORKS"
set "systemYear=2017"
set "yearModified=_%systemYear%-"
echo "%testString%" | find "%yearModified%" >NUL || goto :EOF
set testString=!testString:%yearModified%=^&rem.!
echo %testString%
pause
你应该在延迟扩展模式下使用胡萝卜(^)。