Проблемы в использовании пердеть с пакетного сценария. Двойная прямая косая черта и множественное возникновение

Я пытаюсь создать пакетный сценарий, который редактирует несколько файлов java в проекте из-за некоторых проблем среды разработки. Один из файлов имеет текст, который должен быть прокомментирован.

Таким образом, текст (скажем abc ();) станет комментируемым текстом (//abc ();).

Таким образом, мне нужно добавить двойной передний Слэш.

Я пытался использовать утилиту поиска и замены текста (FART) для замены текста. Но его создание проблемы с косыми чертами. Любая идея о том, как это сделать, будет очень полезной.





Что я пробовал до сих пор:
fart.exe file.java abc(); //abc();


fart.exe -C file.java abc(); //abc();


fart.exe -C file.java "abc();" "//abc();"


fart.exe -C file.java abc(); ^/^/abc();


fart.exe -C file.java abc(); //abc();


К сожалению, ни одна из них не работает, и у меня нет идей.


Получение помощи от link:

https://stackoverflow.com/questions/23359371/remove-slash-blackslash-using-fart

удалить косую черту, черную черную черту с помощью пердеть



Я использовал


fart.exe -C file.java abc(); "//abc();"


Это работает, но также дает некоторые предупреждения.


Во-вторых, есть ограничение, что только первый экземпляр может быть заменен в fart. В файле было несколько вхождений, и он напечатал 6 строк, где вхождение было найдено, но не заменил ни одно из них.

Спасибо за помощь.

2 ответа

  1. Я вижу, вы открыты для альтернатив? Это проще всего сделать в Powershell в наши дни, хотя я могу написать cmd, чтобы заставить его работать, это гораздо более трудоемко.

    Если вы открыты для использования Powershell, в командной строке с поддержкой администратора (нет необходимости открывать приглашение PowwerShell):

    Powershell { $($(get-content "C:\Admin\Stack_Exchange510701_FART\file.java") -replace 'abc\(\)\;','\abc();') -replace '\\\*abc\(\)\;','\abc();' | set-content "C:\Admin\Stack_Exchange510701_FART\file.java" }
    

    Краткое примечание: Я хотел обработать вас повторно запустить его в файле, поэтому я должен был проверить, чтобы убедиться, что вы не продолжаете добавлять скобки в текст.

  2. Я понимаю, как это, и я провел долгую ночь и утро, работая над тем, чтобы вспомнить, как я сделал это в последний раз, и написать сценарий ниже для вас .

    Я работал в основном в этой сфере в течение последних 10 лет или около того, как я заболел несоответствиями в VBScript, и нужно было держать от использования ничего не доступно в родной ОС, где это возможно.

    (Только в последние 2-3 года я чувствую себя достаточно уверенно, что у меня будет большая часть Powershell, в которой я нуждаюсь, доступная мне, поэтому я начал использовать его более конкретно для этого типа проблемы)

    Поэтому я провел несколько долгих часов в течение ночи, работая над версией скрипта, который может заменить комментарии, используя только собственный пакет.

    Это действительно заняло некоторое время, так как прошло по крайней мере год или два с тех пор, как я использовал это на anythign, таком сложном, как код, который дает вам все виды забавных вопросов.

    Приведенный ниже сценарий должен отвечать вашим потребностям, используя только собственный интерпретатор команд windows.

    Я настроил сценарий для создания резервной копии исходных файлов на случай, если я пропустил какой-то сценарий, который я не планировал.

    У меня есть образец файла, который я создал и использовал, и результаты примера показаны после кода ниже.

    Пукать.сценарий cmd:

    REM Script: FART.cmd
    REM Version: 0.9.3
    REM Description: Replaces Text (Argument 2) with alternate Text (Argument 3) in File (Argement 1)
    REM Example Usage: FART.cmd "C:\Admin\Stack_Exchange510701_FART\file.java" "abc();" "\abc();"
    
    @(
        SETLOCAL
        ECHO OFF
        SET "eLvl=0"
        SET "_FilePath=%~1"
        SET "_Find=%~2"
        SET "_Rep=%~3"
        SET "_ReFind=%~3"
        CALL :GetDateTime
    )
    
    CALL :Main
    
    (
        ENDLOCAL
        Exit /b %eLvl%
    )
    
    :Main
    
        REM Set extra replace statement to keep commented matches at two comments depth if the replace string is a comment.
        IF /I "%_Rep:~0,2%" EQU "\" (
            SET "_ReFind=\%_Rep%"
        )
    
        REM Delete Temp File if it exists.
        DEL /F /Q "%_FilePath%.tmp"
    
        REM Make sure Delayed expantion is not turned on for the loop to interpret FindStr Correctly.
        REM Note:  Delayed expantion is diabled by default, however we're just being 'sure' as the FindStr prefix is needed to print blank lines correctly, so we can;t just use "type".
        SETLOCAL DISABLEDelayedExpansion
    
        FOR /F "Tokens=*" %%A IN ('Findstr /n "^" "%_FilePath%"') DO (
    
            SET "_Line=%%A"
    
            REM Enable Delayed expantion within the loop in order to process the line contents correctly.
            SETLOCAL ENABLEDelayedExpansion
    
            REM ECHO.
            REM Remove Prefix from Findstr.  (FindStr prefix is needed to print blank lines correctly)
            SET "_LineP=!_Line:*:=!"
            IF DEFINED _LineP (
                REM Replace + don't expand comments continually
                SET "_LineR=!_LineP:%_Find%=%_Rep%!"
                SET "_LineR=!_LineR:%_ReFind%=%_Rep%!"
            )
            REM ECHO.4
            REM ECHO.!_LineR!
            ECHO.!_LineR!>>"%_FilePath%.tmp"
            REM End the local delayed expantion environment while still within the loop.
            ENDLOCAL
        )
    
        REM End the local Non-Delayed expanion environement needed for the loop explicitly.
        ENDLOCAL
    
        REM Create a backup of the Original File for safety's sake.
        MOVE /Y "%_FilePath%" "%_FilePath%.%IsoDate%_%IsoTime%.bak"
    
        REM Move the temp file to replace the original File
        MOVE /Y "%_FilePath%.tmp" "%_FilePath%"
    GOTO :EOF
    
    :GetDateTime
    
        REM Note: I'm Tooting my own horn here, this took some doing:
        REM I created this Function to handle date and time across systems in different Regions.
        REM This gives the values both in their Zero Prefixed version, and in a version with the zero prefix stripped off so you can use it for calcuations.
        FOR /F "Tokens=1-7 delims=MTWFSmtwfsouehrandit:-\/. " %%A IN ("%DATE% %TIME: =0%") DO (
            FOR /F "Tokens=2-4 Skip=1 Delims=(-)" %%a IN ('ECHO.^| DATE') DO (
                SET "%%~a=%%~A"
                SET "%%~b=%%~B"
                SET "%%~c=%%~C"
                SET /a "#%%~a=1%%~A - (2%%~A-1%%~A)"
                SET /a "#%%~b=1%%~B - (2%%~B-1%%~B)"
                SET /a "#%%~c=1%%~C - (2%%~C-1%%~C)"
                SET "HH=%%~D"
                SET "Mn=%%~E"
                SET "SS=%%~F"
                SET "Ms=%%~G"
                SET /a "#HH=1%%~D - (2%%~D-1%%~D)"
                SET /a "#Mn=1%%~E - (2%%~E-1%%~E)"
                SET /a "#SS=1%%~F - (2%%~F-1%%~F)"
                SET /a "#Ms=1%%~G - (2%%~G-1%%~G)"
                SET /a "#TMinutes=((1%%~D - (2%%~D-1%%~D))*60)+(1%%~E - (2%%~E-1%%~E))"
                SET /a "#TSeconds=((((1%%~D - (2%%~D-1%%~D))*60)+(1%%~E - (2%%~E-1%%~E)))*60)+(1%%~F - (2%%~F-1%%~F))"
            )
        )
        SET "TTime=%HH%.%Mn%.%SS%"
        SET "IsoTime=%HH%.%Mn%.%SS%.%Ms%"
        SET "TDate=%yy%-%mm%-%dd%"
        SET "IsoDate=%yy%-%mm%-%dd%"
    GOTO :EOF
    

    Содержимое файла, который я использовал для тестирования (перед изменением)

    Hello there" Some stuff here"
    "
    ""
    {"orderNumber": "1476628690_2WOSU1OR"}<
    more stuff here
    the end
    C:\Admin\Stack_Exchange071522
    
    Powershell { $OldFile = get-content "C:\Admin\Stack_Exchange510701_FART\file.java" | %{$_ -replace 'abc();','\abc();'}; $OldFile | set-content "C:\Admin\Stack_Exchange510701_FART\file.java" }
    
    etrsyabc();
    abc();
    ghuoyuo | %{8p'\abc();',hio[);'}
    Powefuyo-cytonttgyientt4S ftilyte.javahkjtfy | JIxsdO;{$_ FGTacsde 'abc(YUOYT$YY);','\$abc(7)$;'}TYTY
    \abc();
    abc()
    abc()
    abc();
    wf \abc();
    Powershell { $($(get-content "C:\Admin\Stack_Exchange510701_FART\file.java") -replace 'abc\(\)\;','\abc();') -replace '\\abc\(\)\;','\abc();' | set-content "C:\Admin\Stack_Exchange510701_FART\file.java" }
    Powershell { $($(get-content "C:\Admin\Stack_Exchange510701_FART\file.java") -replace 'abc\(\)\;','\abc();') -replace '\\\*abc\(\)\;','\abc();' | set-content "C:\Admin\Stack_Exchange510701_FART\file.java" }
    Powershell { $($(get-content "C:\Admin\Stack_Exchange510701_FART\file.java") -replace 'abc\(\)\;','\abc();') -replace '\\\*abc\(\)\;','\abc();' | set-content "C:\Admin\Stack_Exchange510701_FART\file.java" }
     $Find='abc\(\)\;'; $Replace=''
    
    Last line befoere 2 blank lines
    

    Содержимое файла, который я использовал для тестирования (после изменения)

    Hello there" Some stuff here"
    "
    ""
    {"orderNumber": "1476628690_2WOSU1OR"}<
    more stuff here
    the end
    C:\Admin\Stack_Exchange071522
    
    Powershell { $OldFile = get-content "C:\Admin\Stack_Exchange510701_FART\file.java" | %{$_ -replace '\abc();','\abc();'}; $OldFile | set-content "C:\Admin\Stack_Exchange510701_FART\file.java" }
    
    etrsy\abc();
    \abc();
    ghuoyuo | %{8p'\abc();',hio[);'}
    Powefuyo-cytonttgyientt4S ftilyte.javahkjtfy | JIxsdO;{$_ FGTacsde 'abc(YUOYT$YY);','\$abc(7)$;'}TYTY
    \\abc();
    abc()
    abc()
    \abc();
    wf \abc();
    Powershell { $($(get-content "C:\Admin\Stack_Exchange510701_FART\file.java") -replace 'abc\(\)\;','\abc();') -replace '\\abc\(\)\;','\abc();' | set-content "C:\Admin\Stack_Exchange510701_FART\file.java" }
    Powershell { $($(get-content "C:\Admin\Stack_Exchange510701_FART\file.java") -replace 'abc\(\)\;','\abc();') -replace '\\\*abc\(\)\;','\abc();' | set-content "C:\Admin\Stack_Exchange510701_FART\file.java" }
    Powershell { $($(get-content "C:\Admin\Stack_Exchange510701_FART\file.java") -replace 'abc\(\)\;','\abc();') -replace '\\\*abc\(\)\;','\abc();' | set-content "C:\Admin\Stack_Exchange510701_FART\file.java" }
     $Find='abc\(\)\;'; $Replace=''
    
    Last line befoere 2 blank lines