проверьте “ЕСЛИ” условие внутри ДЛЯ цикла (batch/cmd)

Как насчет использования этого:

#if DEBUG
            Console.Write("Debugging");
#else
            Console.Write("Final");
#endif

Когда ваше решение скомпилировано с опцией DEBUG, оно выведет «Отладка».

Если ваш компилятор установлен в Release, он напишет «Final».

5
задан T.Todua 3 August 2016 в 09:43
поделиться

5 ответов

Подставить 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
    )
)
10
ответ дан 18 December 2019 в 13:17
поделиться

вот приблизительный 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 для окон, который вы можете использовать без необходимости выучить другой язык.

1
ответ дан 18 December 2019 в 13:17
поделиться

Я думаю, что это слишком сложно сделать в CMD.EXE, и даже просто невозможно, хотя я могу ошибаться в последнем.

Вам лучше использовать WSH (Windows Scripting Host), который позволяет использовать JScript или VbScript и присутствует практически во всех системах. (и вы можете предоставить распространяемый компонент, если хотите)

2
ответ дан 18 December 2019 в 13:17
поделиться

У меня нет опыта работы с 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: Я не тестировал этот сценарий, но, насколько я могу судить, он должен работать.

1
ответ дан 18 December 2019 в 13:17
поделиться

Вы можете преобразовать программу Perl в .exe, который не будет нуждаться в perl, с помощью PAR :: Packer (возможно даже шифрование). Лучше всего использовать Strawberry Perl для Windows для работы с PAR :: Packer, но также возможно использование ActivePerl.

0
ответ дан 18 December 2019 в 13:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: