从包含变量顺序参数的字符串中查找子字符串(文件路径)

时间:2013-04-14 02:17:20

标签: batch-file

%params%包含一组变量参数:

/tidy /log /truncate /convert D:\libdir 或者

/log /tidy D:\cyclea\libfolder /test /convert /truncate

除了(当前单个)filepath元素之外的所有内容我都使用它:

 if "%params%"=="%params:log=%" goto :DontLogit

   if NOT "%params%"=="%params:/tidy=%" (call tidysub: & do something else )

现在我想提取filepath元素并将其用作命令的参数,例如chdir

我玩过,但我对DOS字符串操作和for循环很弱..

我想保持params的顺序变量。 有关信息,请来此处:

   FOR %%s IN (%*) DO (set params=!params! %%s)

2 个答案:

答案 0 :(得分:1)

@ECHO OFF
SETLOCAL
SET swparams=log tidy test convert truncate
FOR %%i IN (%swparams% other) DO SET "%%i="
FOR %%i IN (%*) DO (
  SET "used="
  FOR %%p IN (%swparams%) DO (IF /i "/%%p"=="%%~i" SET %%p=Y&SET used=Y)
  IF NOT DEFINED used CALL SET other=%%other%% "%%~i"
  )

ECHO =============paramsreport===========
FOR %%i IN (%swparams%) DO IF DEFINED %%i (ECHO %%i:set) ELSE (ECHO %%i:clear)
ECHO other=%other%
FOR %%i IN (%other%) DO ECHO %%i or %%~i
GOTO :EOF 

这是一种应该可以扩展的方式。

只需将开关参数设置为swparams中的列表。

参数名称和OTHER设置为[nothing]以确保它们尚未在环境中设置。 Ech提供的参数依次应用于%% i,并依次与每个定义的swparam匹配。在匹配之前清除变量USED,如果找到匹配(/switchparametername,则设置switch参数并设置USED标志。 如果未使用的标志被设置为获得任何开关参数,则使用解析技巧将任何未识别的字符串累积到OTHER

"%%~i"机制首先在%% i中取消引用该项,然后引用它。通过这种方式,它最终会被引用,无论它是否最初都有引号。

/i上的if执行不区分大小写的匹配。

因此运行此批次

thisbatch /tidy "C:\some filename with spaces.txt"

TIDY设置为YLOGtestconverttruncate未设置且other设置为"C:\some filename with spaces.txt"到{{1}}

答案 1 :(得分:0)

@echo off
setlocal EnableDelayedExpansion

rem Get the single filepath element (with colon in second character):
set params=/tidy /log /truncate /convert D:\libdir
set filepath=
for %%a in (%params%) do (
   set par=%%a
   if "!par:~1,1!" == ":" (
      set filepath=%%a
   )
)
if defined filepath (
   echo Filepath = %filepath%
) else (
   echo Filepath not given
)
echo/

rem Get multiple filepath elements in an *array*:
set params=/log /tidy D:\cyclea\libfolder /test /convert D:\libdir /truncate
set i=0
for %%a in (%params%) do (
   set par=%%a
   if "!par:~1,1!" == ":" (
      set /A i+=1
      set filepath[!i!]=%%a
   )
)
echo There are %i% filepath elements:
for /L %%i in (1,1,%i%) do (
   echo %%i- !filepath[%%i]!
)

您可以在此帖子中查看有关阵列管理的更多说明:Arrays, linked lists and other data structures in cmd.exe (batch) script