我需要在Windows批处理文件中实现的代码是这样的(它目前在Perl中):
while(<file>)
{
if($_ =~ m/xxxx/)
{
print OUT "xxxx is found";
}
elsif($_ =~ m/yyyy/)
{
next;
}
else
{
($a,$b) = split(/:/,$_);
$array1[$count] = $a;
$array2[$count] = $b;
$count++;
}
}
我的问题是:
感谢您的关注。如果您知道答案,或者有任何关于如何找到答案的想法/线索,请分享。
编辑:我在Windows工作。我只能使用Windows默认提供的任何内容,这意味着我无法使用Unix实用程序。答案 0 :(得分:9)
将if
放入for
一般很容易:
for ... do (
if ... (
...
) else if ... (
...
) else (
...
)
)
可以使用for
开关编写遍历行的/f
循环:
for /f "delims=" %%s in (*.txt) do (
...
)
正则表达式由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
)
)
答案 1 :(得分:2)
我认为这对CMD.EXE来说太痛苦了,甚至完全不可能,尽管我可能在最后一个错误。
最好使用WSH(Windows Scripting Host),它允许您使用JScript或VbScript,并且几乎存在于每个系统中。 (如果需要,您可以提供可再发行的)
答案 2 :(得分:1)
这是一个与你的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
为了您的信息,您可以使用Windows的Perl,而无需学习其他语言。
答案 3 :(得分:1)
我没有使用perl的经验,但如果我理解你的命令,就会是这样的。请注意,批处理脚本非常原始,并且它没有任何好的方法进行清理,因此某些字符(主要是&amp; |&lt;&gt;)会将其分解为碎片。
@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 ENABLEDELAYEDEXPANSION”替换“SETLOCAL”并使用!ARRAY1 [%COUNT%]!
PS:我没有测试过这个脚本,但据我所知它应该可以工作。
答案 4 :(得分:0)
您可以将Perl程序转换为不需要perl {。{}}的.exe(甚至可以进行加密)。最好使用PAR::Packer来处理PAR :: Packer,但也可以使用ActivePerl。
答案 5 :(得分:0)
{{1}}