Как насчет использования этого:
#if DEBUG
Console.Write("Debugging");
#else
Console.Write("Final");
#endif
Когда ваше решение скомпилировано с опцией DEBUG, оно выведет «Отладка».
Если ваш компилятор установлен в Release, он напишет «Final».
Подставить if
в для
в целом просто:
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
)
)
вот приблизительный vbscript-эквивалент вашего Perl-скрипта.
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 для окон, который вы можете использовать без необходимости выучить другой язык.
Я думаю, что это слишком сложно сделать в CMD.EXE, и даже просто невозможно, хотя я могу ошибаться в последнем.
Вам лучше использовать WSH (Windows Scripting Host), который позволяет использовать JScript или VbScript и присутствует практически во всех системах. (и вы можете предоставить распространяемый компонент, если хотите)
У меня нет опыта работы с 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» и использовать! ARRAY1 [% COUNT%]!
PS: Я не тестировал этот сценарий, но, насколько я могу судить, он должен работать.
Вы можете преобразовать программу Perl в .exe, который не будет нуждаться в perl, с помощью PAR :: Packer (возможно даже шифрование). Лучше всего использовать Strawberry Perl для Windows для работы с PAR :: Packer, но также возможно использование ActivePerl.