Batch file 勾选“;如果;循环内部条件(批处理/cmd)
我需要在Windows批处理文件中实现的代码如下(目前是Perl):Batch file 勾选“;如果;循环内部条件(批处理/cmd),batch-file,Batch File,我需要在Windows批处理文件中实现的代码如下(目前是Perl): while() { 如果($\ux=~m/xxxx/) { 打印出“xxxx已找到”; } elsif($\uyyy=~m/yyyy/) { 下一个 } 其他的 { ($a,$b)=拆分(/:/,$); $array1[$count]=$a; $array2[$count]=$b; $count++; } } 我的问题是: Windows批处理文件中可能存在这种复杂程度吗 如果是,我如何设置If条件 在for循环中读取文本
while()
{
如果($\ux=~m/xxxx/)
{
打印出“xxxx已找到”;
}
elsif($\uyyy=~m/yyyy/)
{
下一个
}
其他的
{
($a,$b)=拆分(/:/,$);
$array1[$count]=$a;
$array2[$count]=$b;
$count++;
}
}
我的问题是:
编辑:我在Windows中工作。默认情况下,我只能使用Windows提供的任何工具,这意味着我不能使用Unix实用程序。我认为在CMD.EXE中执行此操作太痛苦,甚至完全不可能,尽管我可能在最后一个问题上弄错了
您最好使用WSH(Windows脚本主机),它允许您使用JScript或VbScript,并且几乎存在于每个系统中。(如果需要,您可以提供一个可再发行的版本)这里是一个与Perl脚本相当的粗略vbscript
Set objFS = CreateObject("Scripting.FileSystemObject")
strFile = "c:\test\file.txt"
Set objFile = objFS.OpenTextFile(strFile)
Dim array1()
Dim array2()
count=0
Do Until objFile.AtEndOfStream
strLine = objFile.ReadLine
If InStr(strLine,"xxxx") >0 Then
WScript.Echo " xxxx is found."
Else
s = Split(strLine,":")
ReDim Preserve array1(count)
ReDim Preserve array2(count)
array1(count)=s(0)
array2(count)=s(1)
count=count+1
End If
Loop
'print out the array elements
For i=LBound(array1) To UBound(array2)
WScript.Echo array1(i)
WScript.Echo array2(i)
Next
仅供参考,您可以使用Perl For windows,而无需学习其他语言。您可以将Perl程序转换为不需要Perl的.exe(甚至可以进行加密)。最好使用PAR::Packer,但也可以使用ActivePerl。我没有使用perl的经验,但如果我正确理解了您的命令,就会是这样。请注意,批处理脚本非常原始,并且没有任何好的清理方法,因此某些字符(&|大部分)会将其拆分
@ECHO OFF
SETLOCAL
SET COUNT=0
FOR /F "DELIMS=" %%A IN ('file') DO CALL :SCAN %%A
:SCAN
ECHO %*|FIND "xxxx">NUL
IF %ERRORLEVEL%==0 ECHO xxxx is found&GOTO :EOF
ECHO %*|FIND "yyyy">NUL
IF %ERRORLEVEL%==0 GOTO :EOF
FOR /F "TOKENS=1,2 DELIMS=:" %%A IN ('ECHO %*') DO SET ARRAY1[%COUNT%]=%%A&SET ARRAY2[%COUNT%]=%%B
SET /A COUNT+=1
如果使用FINDSTR而不是FIND,则可以使用regexp。如果要使用ARRAY1[%COUNT%](其中包含一个变量)的值,则必须将“SETLOCAL”替换为“SETLOCAL ENABLEDELAYEDEXPANSION”,并使用!阵列1[%COUNT%]
PS:我没有测试这个脚本,但据我所知它应该可以工作。将
if
放入for
通常很容易:
for ... do (
if ... (
...
) else if ... (
...
) else (
...
)
)
可以使用/f
开关编写迭代行的for
循环:
for /f "delims=" %%s in (*.txt) do (
...
)
regexp由findstr
提供。如果没有提供输入文件,它将与stdin匹配。您可以将输出重定向到NUL
,这样它就不会显示找到的字符串,只需使用它的errorlevel
查看它是否匹配(0表示匹配,非0表示不匹配)。您可以再次使用/f
拆分字符串。因此:
set count=0
for /f "delims=" %%s in (foo.txt) do (
echo %%s | findstr /r xxxx > NUL
if errorlevel 1 (
rem ~~~ Didn't match xxxx ~~~
echo %%s | findstr /r yyyy > NUL
if errorlevel 1 (
rem ~~~ Didn't match yyy ~~~
for /f "delims=; tokens=1,*" %%a in ('echo %%s') do (
set array1[!count!]=%%a
set array2[!count!]=%%b
set /a count+=1
)
)
) else (
echo XXX is found
)
)
这是可能的!
首先说明需要哪种类型的批处理。例如,BASH可以比NT的cmd.exe做得更多、更简单。您的答案决定了问题的答案。特别是您是在Win32还是UNIX环境中工作?例如,我想,使用基本windows很难进行拆分。拆分将使用
for/f
完成。不是很漂亮的语法,但也不是很难。嗨,谢谢你的VBScript。这似乎是一个很好的替代批次。至于windows上的perl,是的,我在windows中使用perl。但是我想要的批处理代码是为一个客户编写的,他-天知道为什么-不想在他的PC上安装perl:-)你可以安装Perl2exe并将perl脚本转换为可执行文件进行分发。-1提供VBScript实现而不是JScript(不,只是开玩笑)Minaev编写数组[!count!]而不是数组[%count%]这是因为for循环中的变量在循环执行时立即展开,因此在循环期间,计数始终被读取为0。因此,有必要使用延迟变量展开,以便在读取行时展开值。无论如何,我的警告也适用于这里:如果文件中有像|&这样的字符,批处理脚本将出现错误行为。是的,这是在批处理文件中执行此操作的方法。但这必须留给那些必须维护它的批量专家。
set count=0
for /f "delims=" %%s in (foo.txt) do (
echo %%s | findstr /r xxxx > NUL
if errorlevel 1 (
rem ~~~ Didn't match xxxx ~~~
echo %%s | findstr /r yyyy > NUL
if errorlevel 1 (
rem ~~~ Didn't match yyy ~~~
for /f "delims=; tokens=1,*" %%a in ('echo %%s') do (
set array1[!count!]=%%a
set array2[!count!]=%%b
set /a count+=1
)
)
) else (
echo XXX is found
)
)
FOR ................. DO (
(YOUR_CONDITION && echo "YES" ) || (echo "NO")
)