我正在尝试创建批处理脚本,由于某些开发环境问题而在项目中编辑了很少的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();
不幸的是,他们都没有工作,我没有想法。
从链接中获取帮助:
https://stackoverflow.com/questions/23359371/remove-slash-blackslash-using-fart
remove slash , blackslash using FART
我用过
fart.exe -C file.java abc(); "\/\/abc();"
这有效,但也会产生一些警告。
其次,是否有限制只能在屁中替换第一个实例。在一个文件中,有多次出现并且它打印了6行,其中发现了事件,但没有替换它们。
感谢您帮助我。
答案 0 :(得分:0)
我看到你对替代方案持开放态度?这些日子最容易在Powershell中完成,虽然我可以写一个cmd来使其工作,但这样做更加费力。
如果您愿意使用Powershell,请在启用管理员的命令提示符中弹出以下内容(无需打开PowwerShell提示符):
Powershell { $($(get-content "C:\Admin\Stack_Exchange\40510701_FART\file.java") -replace 'abc\(\)\;','\\abc();') -replace '\\\\\\*abc\(\)\;','\\abc();' | set-content "C:\Admin\Stack_Exchange\40510701_FART\file.java" }
简要说明:我想处理你在文件上重新运行它,所以我必须检查所以确保你没有继续在文本中添加大括号。
答案 1 :(得分:0)
我明白这是怎么回事,我已经花了很长的一个晚上和早上的工作来记住我上次这样做并为你编写下面的脚本。
在过去10年左右的时间里,我一直在这个领域工作,因为我厌倦了VBScript中的不一致,并且需要尽可能不使用本机操作系统中没有的任何东西。
(仅在过去的2到3年里,我才有足够的信心,我将拥有我需要的大部分Powershell,所以我已经开始更多地使用它了特别为此问题类型)
因此,我花了几个小时的时间来处理脚本版本,该脚本只能使用本机批量替换注释。
这真的花了一些时间,至少已经有一年了,因为我在任何代码上使用它都像代码一样复杂,它会给你带来各种有趣的问题。
以下脚本应仅使用本机Windows CMD Interpreter来满足您的需求。
我已经设置了脚本来创建原始文件的备份,以防万一我错过了一些我没有计划的场景。
我有我创建和使用的示例文件,示例结果显示在下面的代码之后。
Fart.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_Exchange\40510701_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_Exchange\40071522
Powershell { $OldFile = get-content "C:\Admin\Stack_Exchange\40510701_FART\file.java" | %{$_ -replace 'abc();','\\abc();'}; $OldFile | set-content "C:\Admin\Stack_Exchange\40510701_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_Exchange\40510701_FART\file.java") -replace 'abc\(\)\;','\\abc();') -replace '\\\\abc\(\)\;','\\abc();' | set-content "C:\Admin\Stack_Exchange\40510701_FART\file.java" }
Powershell { $($(get-content "C:\Admin\Stack_Exchange\40510701_FART\file.java") -replace 'abc\(\)\;','\\abc();') -replace '\\\\\\*abc\(\)\;','\\abc();' | set-content "C:\Admin\Stack_Exchange\40510701_FART\file.java" }
Powershell { $($(get-content "C:\Admin\Stack_Exchange\40510701_FART\file.java") -replace 'abc\(\)\;','\\abc();') -replace '\\\\\\*abc\(\)\;','\\abc();' | set-content "C:\Admin\Stack_Exchange\40510701_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_Exchange\40071522
Powershell { $OldFile = get-content "C:\Admin\Stack_Exchange\40510701_FART\file.java" | %{$_ -replace '\\abc();','\\abc();'}; $OldFile | set-content "C:\Admin\Stack_Exchange\40510701_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_Exchange\40510701_FART\file.java") -replace 'abc\(\)\;','\\abc();') -replace '\\\\abc\(\)\;','\\abc();' | set-content "C:\Admin\Stack_Exchange\40510701_FART\file.java" }
Powershell { $($(get-content "C:\Admin\Stack_Exchange\40510701_FART\file.java") -replace 'abc\(\)\;','\\abc();') -replace '\\\\\\*abc\(\)\;','\\abc();' | set-content "C:\Admin\Stack_Exchange\40510701_FART\file.java" }
Powershell { $($(get-content "C:\Admin\Stack_Exchange\40510701_FART\file.java") -replace 'abc\(\)\;','\\abc();') -replace '\\\\\\*abc\(\)\;','\\abc();' | set-content "C:\Admin\Stack_Exchange\40510701_FART\file.java" }
$Find='abc\(\)\;'; $Replace=''
Last line befoere 2 blank lines