String 空格上的批处理脚本特征线?

String 空格上的批处理脚本特征线?,string,batch-file,String,Batch File,我正在使用下面的一段代码;要更改CMAKE文件中的内容,请执行以下操作: for /f %%j in (CMakeLists.txt) do ( if "%%j"=="Extensions_AntTweakBar" ( echo #Extensions_AntTweakBar >> temp.tmp ) else ( if "%%j"=="Extensions_Inspection" ( echo #Extensions_Inspection >> t

我正在使用下面的一段代码;要更改CMAKE文件中的内容,请执行以下操作:

for /f %%j in (CMakeLists.txt) do (
 if "%%j"=="Extensions_AntTweakBar" (
  echo #Extensions_AntTweakBar >> temp.tmp 
 ) else (
  if "%%j"=="Extensions_Inspection" (
   echo #Extensions_Inspection >> temp.tmp
  ) else (
      if "%%j"=="Extensions_InspectionBar" (
    echo #Extensions_InspectionBar >> temp.tmp
   ) else (
    echo %%j >> temp.tmp
   )
  )
 )
)
它似乎起作用了,也就是说,它确实改变了选定的行,但是,如果一行上有空格,它只会得到该行,直到出现空格为止。 例如:

SET( PROJECT_NAME "MyProject")
仅获取字符串:

SET(

那么我应该如何获取完整字符串呢?

默认分隔符是空格和制表符。如果覆盖默认分隔符,则它应该读取整行,中间有空格

for /f "delims=@" %%j in (CMakeLists.txt) do

我将其设置为@,它将忽略空格作为分隔符并读取整行。您可以将其设置为一个您知道不会出现在文本文件中的唯一字符。

在代码中,您可以在每行添加一个空格

echo %%j[space]>> temp.tmp
您可以在此处删除它(仅适用于%%j),但通常最好将重定向设置为前缀,如

>> temp.tmp echo %%j
如果使用普通变量,后缀变量可能会失败

set var=hallo2
echo %var%>temp.tmp
扩展为echo hallo2>temp.tmp或echo hallo2>temp.tmp,因此只有stderr会重定向。 下一个问题是关键字开-关/?,如果您的文件包含这样一个单词,您会得到意外的结果,因为回音将解释这些单词

[编辑:]要解决此问题,您可以使用echo(

您可以得到空行(或只有空格的行),您只需要给它们加前缀

for /f "delims=" %%a in ('findstr /n ".*" qut.bat') do (
    set var=%%a
    setlocal EnableDelayedExpansion
    echo(!var:*:=!
    endlocal
)

切换DelayedExpansion是保留“!”和“^”字符的必要条件

我现在确实有点爱你,但是它没有空行?@Skeen:for总是跳过空行。你没有办法在批处理文件中处理它们(至少我不知道)。Eric:如果你这样做的话,
“delims=@”
如果没有实际的分隔符,您也可以使用
“delims=“
”来达到相同的效果–您不需要考虑输入中没有出现的字符。我将尝试研究一下:)
for /f "delims=" %%a in ('findstr /n ".*" qut.bat') do (
    set var=%%a
    setlocal EnableDelayedExpansion
    echo(!var:*:=!
    endlocal
)