2013-04-14 43 views
0

%params%包含一个变量组参数:查找字符串包含可变顺序参数的子串(文件路径)

/tidy /log /truncate /convert D:\libdir 也许

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

的一切,但(目前单)文件路径元素我使用它:

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) 

回答

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

+0

Aacini,非常感谢。这现在在我的代码中。我曾经想过结肠,但想不起如何提取它。事实上,它总是会在那里,在第二个字符只是没有计算。另外我也会把自己与潜在的文件路径混为一谈。\等等。有时我只是想念那些显而易见的东西。我实际上不会使用多文件路径;我的大脑又一次变得复杂化了,但是谢谢它,因为我需要类似的东西。再次感谢所有最好的比尔 – user2278681

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设置为[无]以确保它们尚未设置在环境中。 Ech提供的参数依次应用于%% i,并依次与每个定义的swparam进行匹配。在匹配之前清除变量USED,并且如果找到匹配(/switchparametername),则设置开关参数并设置USED标志。 如果没有设置使用标志gainst任何开关参数,则解析技巧是用来积累任何不能识别的字符串为OTHER

"%%~i"机制第一dequotes中%%我的项目,然后引用它。通过这种方式,它最终报价,不管它原来有报价或没有。

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

因此运行这个批处理

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

将产生TIDY设置为YLOGtestconvert,没有设置truncateother设置为"C:\some filename with spaces.txt"

+0

感谢这对彼得和抱歉延迟回应。 – user2278681

相关问题