使用“=&rem”通过输入变量批量操作字符串。
在这里使用Server 2016进行简单的批处理文件编程(现在)。使用“=&rem”通过输入变量批量操作字符串。
我有我认为的一个简单的问题,只是我现在看不到一个可行的解决方案。我将限制我的请求到测试场景,以保持简单。我试图做的是从右边修剪一个字符串,直到以“_%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-”硬编码在第十行。我所期待的在REM线特别纯粹的逻辑意义的事:
set testString=%testString:%yearModified%=&rem.%
由于存在这些命令修改后的TestString在线的方式,使得它难以注入变量进去。我尝试了一个巨大的转义和扩展设置组合来让变量取得迄今为止的成功。我也尝试作为一个字符串,以“打造”的命令,并试图把它和管道输出到一个变量:
@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-”完美搭配。消除这种维护是很好的。
任何帮助或方向表示赞赏。
谢谢。
我可以告诉你分裂的另一种方法。用适当的分隔符替换您的“分隔符串”,并使用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
只要确保你使用分隔符(§
这里)是肯定不会在你的字符串(S )。
谢谢!这似乎是一个更强大的解决方案,可以在不使用DelayedExpansion的情况下工作,并且操作本身也是单线解决方案,用于增加内容(有些人更喜欢可读性和其他简洁性)。 – GHTurbines
不错的把戏+1。没有检查CutHere是否存在,可以使用'tokens = 1,2'和'if'%% b“neq”“(设置Result = %% a)else exit/b 1'来完成 – LotPings
@LotPings :如果没有分隔符,我希望它会返回整个字符串,但是,其他人可能会有其他期望/需求。 – Stephan
你正在试图控制你所说的采用可变
尝试使用一个临时文件,而不是内容 -
echo %%testString:%yearModified%=^&rem.%%" > temp.bat
call temp.bat > %testString%
谢谢!我能够通过一些修改来使用您的语法,以便从临时批处理文件中处理命令。我将不得不记住未来的工作方式。 – GHTurbines
您NEED延迟扩展这种类型的操作,所以enabe它。
- 我建议首先得到的字符串
- 的剩余部分,并从原来的字符串中删除这一点。
@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
谢谢!这工作很好,切换DelayedExpansion。我会将此语法添加到我的工具箱中。 – GHTurbines
为什么你明确禁用延迟扩展? – Stephan
作为一种习惯,我通常禁用它,只有在需要保持语法通用时才启用/禁用它。桌面上的任何选项都可以解决这个问题,所以我明白为什么要明确说明这可能看起来很奇怪。 – GHTurbines