按输入变量批量操作字符串使用" =& rem。"

时间:2017-09-12 07:43:32

标签: string batch-file scripting string-substitution

在此使用Server 2016进行简单的批处理文件编程(暂时)。

我认为这是一个简单的问题,只是因为我现在没有在我面前找到可行的解决方案。我将我的请求限制在测试场景中,以保持简单。我想要做的是从右边修剪一个字符串,直到它按照格式" _%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的方式,因此很难将变量注入其中。我已经尝试了一个转义和扩展设置的巨大组合来获取变量,到目前为止没有成功。我也尝试过#34; 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 - "完美地运行。硬编码。消除那一点维护会很好。

感谢任何帮助或指示。

谢谢。

4 个答案:

答案 0 :(得分:1)

我可以告诉你另一种分裂方法。用适当的分隔符替换“Delimiterstring”并使用UploadedFileReferenceConverter分割(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 )肯定不在您的字符串中。

答案 1 :(得分:0)

您正试图使用​​变量

的内容来控制您所调用的内容

尝试使用临时文件 -

echo %%testString:%yearModified%=^&rem.%%" > temp.bat
call temp.bat > %testString%

答案 2 :(得分:0)

需要这种类型的操作延迟扩展,所以启用它。

  • 我建议首先获取字符串的剩余部分
  • 并从原始字符串中删除它。
.kern

示例输出:

@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

答案 3 :(得分:0)

@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

您应该在“延迟扩展”模式下使用胡萝卜(^)。