2016-11-09 6 views
0

いくつかの開発環境の問題のために、プロジェクト内のいくつかのJavaファイルを編集するバッチスクリプトを作成しようとしています。ファイルの1つにコメントが必要なテキストがあります。
したがって、テキスト(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();"
を使用。

第2に、おならの中で最初のインスタンスのみを置き換えることができるという制限があります。ファイル内には複数のオカレンスがあり、オカレンスが見つかったところで6行を出力しましたが、それらのどれも置き換えられませんでした。

私を助けてくれてありがとう。

+0

私はこのツールの名前が非常に悪いと思う唯一の人ですか? :-) –

+0

私はあなたと一緒に@ThorstenDittmar :-) rep.exeを使ってexeファイルの名前を変更した理由を教えてください。いくつかの名前は... – ashu

+0

'fart.exe -C file.java" abc(); " "\/\/abc();" 'と' abc(); 'も文字列の丸括弧のために二重引用符で囲まれています。別のツールを使用する方法については、[Windowsのコマンドライン環境を使ってファイル内のテキストを見つけて置き換える方法は?](http://stackoverflow.com/questions/60034/)私のお気に入りは__xchang32__ですジョブを 'xchang32.exe file.java" abc();に置き換えてください。 "// abc();" ' – Mofi

答えて

0

私はこれがどういうものか理解しています。私はこの前回のやり方を覚えて、あなたのために下のスクリプトを書くことに長い夜と朝を費やしました。

私は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 
+0

それはかなり長いスクリプトです。私はそれを試み、あなたに戻ってくるでしょう。助けてくれてありがとう:) – ashu

+0

あなたが探しているものは、ネイティブのCMDスクリプトだけで達成するのは非常に難しいです。不可能ではないが、それは多くかかる。上記のスクリプトはすべてのシナリオで動作するわけではありませんが、上記のテキストファイルを期待どおりにコメントしますが、これがうまくいかない場合には、おそらく拡張されて –

+0

がこれまでに動作しましたか?ネイティブCMDソリューションですか? –

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" } 

ブリーフ注:私はあなたがそれを再実行扱いたかったですあなたがテキストにカッコを追加していないことを確認しなければならなかったので、私はチェックしなければなりませんでした。

+0

Powershellが私の選択でした。しかし、残念ながら、それはブロックされ、私たちは管理者権限を持っていません。だから私はバッチを開始した。私はオープンシステムで試してみると、それが動作すれば、PowerShellにアクセスできるかどうかがわかります。とにかくありがとう:) – ashu

+0

私はそれがどのように理解しています、あなたは少なくとも一時ファイルを書くことができますか?私はCMDでもできるだけ多くのことをするのが好きですが、ファイルの内容を読むことになると、変数(aprox 4096バイト)の式やループ変数(約8192バイト)の限界を打ち破り、 .cmdを使用して64ビットを取得し、再帰を利用することは、たいていの場合、数桁の大きさでしか行いません。エラーを起こしにくく、ファイル全体を一時ファイルに書き込んで移動して元のファイルと置き換えるバッチを書くのにははるかに単純なコードです。 –

+0

これはあなたの最善の賭けになります。一時ファイルを使用することができれば、素早く汚いでしょう: –

関連する問題