2016-09-20 12 views
2

嗨我有一個腳本,我使用this頁面上的信息。如何運行聯合findstr腳本

我意識到,運行兩個單獨的批處理文件(:SetVar:Brains)將工作,但是當我嘗試將兩者合併爲一個時它不起作用。

如果有人能向我解釋爲什麼我的不工作,並告訴我我能做些什麼來開展工作,我會很高興。

:SetVar 
Brains "Hello" "Goodbye" "input.txt" > "newfile.txt" 
GOTO :Brains 

:Brains 
SETLOCAL ENABLEEXTENSIONS 
SETLOCAL DISABLEDELAYEDEXPANSION 
if "%~1"=="" findstr "^::" "%~f0"&GOTO:EOF 
for /f "tokens=1,* delims=]" %%A in ('"type %3|find /n /v """') do (
    set "line=%%B" 
    if defined line (
     call set "line=echo.%%line:%~1=%~2%%" 
     for /f "delims=" %%X in ('"echo."%%line%%""') do %%~X 
    ) ELSE echo. 
) 
PAUSE 

當我使用call命令:

call :SetVar 
call :Brains 
goto :eof 
pause 

:SetVar 
:Brains "Hello" "Goodbye" "input.txt" > "newfile.txt" 
goto :eof 

:Brains 
SETLOCAL ENABLEEXTENSIONS 
SETLOCAL DISABLEDELAYEDEXPANSION 
if "%~1"=="" findstr "^::" "%~f0"&GOTO:EOF 
for /f "tokens=1,* delims=]" %%A in ('"type %3|find /n /v """') do (
    set "line=%%B" 
    if defined line (
     call set "line=echo.%%line:%~1=%~2%%" 
     for /f "delims=" %%X in ('"echo."%%line%%""') do %%~X 
    ) ELSE echo. 
) 
goto :eof 

我沒有錯誤,但我得到:

C:\Users\MALKAVIAN\Batch files\change words in file>CALL :SetVar 

C:\Users\MALKAVIAN\Batch files\change words in file>goto :eof 

C:\Users\MALKAVIAN\Batch files\change words in file>CALL :Brains 

C:\Users\MALKAVIAN\Batch files\change words in file>goto :eof 

C:\Users\MALKAVIAN\Batch files\change words in file>pause 
Press any key to continue . . . 
+0

什麼具體「不起作用」? – geisterfurz007

+0

@ geisterfurz007 - 我想運行這兩個腳本(在一個'.bat'文件中而不是兩個),並具有相同的效果。 – MALKAVIAN

+0

我明白那個部分,但錯誤的效果是什麼樣子?程序是不會做什麼的,它會帶來錯誤的結果/與其他版本不同。順便說一句,我很好奇第二行應該做什麼。我沒有真正進入批處理,所以這可能是一個愚蠢的問題......您可以嘗試在第二行前面撥打電話(而不是'GOTO',但上面的行) – geisterfurz007

回答

2

你可以試試這個批處理文件:

我在新的文本文件增加了第四個參數輸出替換的結果:

編輯

因此,作爲一個例子,你可以找到"http"替換爲"https"

@echo off 
set "NewStr=https" 
set "InFile=%~dp0%~n0_InputTest.txt" 
set "OutPutFile=%~dp0%~n0_OutPutTest.txt" 
If Exist "%InFile%" Del "%InFile%" 
If Not Exist "%InFile%" Call :CreateExampleInputFile 
Call :FindReplace "" "%NewStr%" "%InFile%" 
pause 
set "OldStr=http" 
Call :FindReplace "%OldStr%" "%NewStr%" "%InFile%" "%OutPutFile%" 
Start "" "%OutPutFile%" 
Pause & Exit /b 
::************************************************************** 
:FindReplace <OldStr> <NewStr> <InFile> <OutPutFile> 
REM -- Prepare the Command Processor -- 
SETLOCAL ENABLEEXTENSIONS 
SETLOCAL DISABLEDELAYEDEXPANSION 
::FindReplace - parses a File line by line and replaces a substring" 
::syntax: FindReplace <OldStr> <NewStr> <InFile> <OutPutFile> 
::   OldStr [in] - string to be replaced 
::   NewStr [in] - string to replace with 
::   InFile [in] - file to be parsed 
::   OutFile[out] - New output file 
if "%~1"=="" findstr "^::" "%~f0"&GOTO:EOF 
(
    for /f "tokens=1,* delims=]" %%A in ('"type %3|find /n /v """') do (
     set "line=%%B" 
     if defined line (
      call set "line=echo.%%line:%~1=%~2%%" 
      for /f "delims=" %%X in ('"echo."%%line%%""') do %%~X 
     ) ELSE echo. 
    ) 
)>%4 
Exit /b 
::************************************************************** 
:CreateExampleInputFile 
(
    echo http://www.hyperdebrid.com 
    echo http://www.fakirdebrid.net 
    echo http://www.keepfiles.fr 
    echo http://www.4shared.com 
    echo http://1fichier.com 
    echo http://www.mega.co.nz 
    echo http://www.mediafire.com 
    echo http://www.uploaded.net 
    echo http://www.oboom.com 
    echo http://www.letitbit.net 
    echo http://www.keep2share.cc 
    echo http://alfafile.net 
    echo http://www.bigfile.to 
    echo http://www.dailymotion.com 
    echo http://www.datafile.com 
    echo http://www.Depfile.com 
    echo http://www.Dropbox.com 
    echo http://www.Extmatrix.com 
    echo http://www.Fboom.me 
    echo http://www.Filefactory.com 
    echo http://www.Filesmonster.com 
    echo http://www.Fshare.vn 
    echo http://www.Keep2share.com 
    echo http://www.Mega.nz 
    echo http://www.Rapidgator.net 
    echo http://www.Scribd.com 
    echo http://www.Soundcloud.com 
    echo http://www.Speedyshare.com 
    echo http://www.Turbobit.net 
    echo http://www.Vimeo.com 
)>"%InFile%" 
::************************************************************** 
+0

不錯的文件!你怎麼讓它變得如此多彩? – MALKAVIAN

+0

絕對完美!非常感謝! – MALKAVIAN

0
@echo off 

:SetVar 
call :Brains "Hello" "Goodbye" "input.txt" 
GOTO :Brains 

:Brains 
SETLOCAL ENABLEEXTENSIONS 
SETLOCAL DISABLEDELAYEDEXPANSION 
if "%~1"=="" findstr "^::" "%~f0"&GOTO:EOF 
for /f "tokens=1,* delims=]" %%A in ('"type %3|find /n /v """') do (
    set "line=%%B" 
    if defined line (
     call set "line=echo.%%line:%~1=%~2%%" 
     for /f "delims=" %%X in ('"echo."%%line%%""') do %%~X 
    ) ELSE echo. 
) 
PAUSE 

最後一隻試,因爲我想要一個友善的人以幫助...將此代碼放入批處理文件中,並將該批處理文件放在與input.txt相同的目錄中。將文本放在該文本文件中,保存並運行該腳本。它應該回顯在文檔中寫入的所有行,並且在輸出中也將Hello更改爲Goodbye

+0

你在跑什麼? – MALKAVIAN

+0

@Malkavian Windows 7 – geisterfurz007

+0

不起作用我得到空白的cmd窗口。當我仔細查看時,發現錯誤「該進程試圖寫入一個不存在的管道。」我順便運行了Windows 10。 – MALKAVIAN

1

我希望這可以幫助你解決你的問題。

@ECHO OFF 
SETLOCAL ENABLEEXTENSIONS DISABLEDELAYEDEXPANSION 

CALL :Brains "Hello" "Goodbye" "input.txt" 
GOTO :EOF 

:Brains 
IF "%~1"=="" (FINDSTR/R "^::" "%~f0" 
    PAUSE 
    GOTO :EOF) 
(FOR /F "TOKENS=1* DELIMS=]" %%A IN ('FIND /N /V ""^<%3') DO (IF "%%~B" EQU "" (
      ECHO=) ELSE (SET "line=%%B" 
      CALL ECHO=%%line:%~1=%~2%%)))>"newfile.txt" 
PAUSE 
+0

爲什麼選擇downvote?我測試了它,它工作得很好! – geisterfurz007