2017-09-12 95 views
1

在这里使用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-”完美搭配。消除这种维护是很好的。

任何帮助或方向表示赞赏。

谢谢。

+1

为什么你明确禁用延迟扩展? – Stephan

+0

作为一种习惯,我通常禁用它,只有在需要保持语法通用时才启用/禁用它。桌面上的任何选项都可以解决这个问题,所以我明白为什么要明确说明这可能看起来很奇怪。 – GHTurbines

回答

1

我可以告诉你分裂的另一种方法。用适当的分隔符替换您的“分隔符串”,并使用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 )。

+0

谢谢!这似乎是一个更强大的解决方案,可以在不使用DelayedExpansion的情况下工作,并且操作本身也是单线解决方案,用于增加内容(有些人更喜欢可读性和其他简洁性)。 – GHTurbines

+0

不错的把戏+1。没有检查CutHere是否存在,可以使用'tokens = 1,2'和'if'%% b“neq”“(设置Result = %% a)else exit/b 1'来完成 – LotPings

+0

@LotPings :如果没有分隔符,我希望它会返回整个字符串,但是,其他人可能会有其他期望/需求。 – Stephan

0

你正在试图控制你所说的采用可变

尝试使用一个临时文件,而不是内容 -

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

谢谢!我能够通过一些修改来使用您的语法,以便从临时批处理文件中处理命令。我将不得不记住未来的工作方式。 – GHTurbines

0

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 
+0

谢谢!这工作很好,切换DelayedExpansion。我会将此语法添加到我的工具箱中。 – GHTurbines