私はこれがどういうものか理解しています。私はこの前回のやり方を覚えて、あなたのために下のスクリプトを書くことに長い夜と朝を費やしました。
私はVBScriptの不一致に気付き、可能な限りネイティブOSで利用できないものを使用しないようにする必要があったため、過去10年ほどの間、その領域内でほとんど作業しました。
(これは、私が私に利用可能なPowerShellのほとんどを持っていると確信しているので、特にこのタイプの問題には使い始めました)
私は、ネイティブのバッチのみを使用してコメントを置き換えることができるスクリプトのバージョンで働く夜間に、何時間も費やしました。
これは、私があなたにあらゆる種類の楽しい問題を与えるコードほど複雑なanythignでこれを使用して以来、少なくとも1年で2回になりました。
以下のスクリプトは、ネイティブウィンドウのCMDインタプリタのみを使用して、ニーズに合っている必要があります。
元のファイルのバックアップを作成するスクリプトを設定しましたが、私が計画していなかったいくつかのシナリオを逃してしまった場合に備えてです。
サンプルファイルを作成して使用しました。サンプルコードの後にサンプル結果が表示されます。
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
私はこのツールの名前が非常に悪いと思う唯一の人ですか? :-) –
私はあなたと一緒に@ThorstenDittmar :-) rep.exeを使ってexeファイルの名前を変更した理由を教えてください。いくつかの名前は... – ashu
'fart.exe -C file.java" abc(); " "\/\/abc();" 'と' abc(); 'も文字列の丸括弧のために二重引用符で囲まれています。別のツールを使用する方法については、[Windowsのコマンドライン環境を使ってファイル内のテキストを見つけて置き換える方法は?](http://stackoverflow.com/questions/60034/)私のお気に入りは__xchang32__ですジョブを 'xchang32.exe file.java" abc();に置き換えてください。 "// abc();" ' – Mofi