2015-11-03 24 views
0

嗨我正在嘗試搜索並替換一系列文件夾中一系列批處理文件中包含用戶名的字符串。即我在網絡驅動器上有一系列批處理文件,需要將它們傳輸到本地PC驅動器以供某些同事使用,並且在此過程中我需要更改批處理文件中的用戶名以匹配本地PC的用戶名。用戶名必須全部使用大寫字母。爲此,我使用一段代碼對單個文件執行相同的操作,但是我無法將代碼轉換爲對一系列文件夾中的一系列文件執行相同的操作。我正在使用Windows 7機器。我試過的代碼如下(請注意,第一段代碼將網絡驅動器(O:-drive)的樹結構映射到本地驅動器(B:-drive),並複製不需要的文件在移動的過程中被改變讓我煩惱的部分從線SETLOCAL ENABLEDELAYEDEXPANSION)開始:在一系列批處理文件中搜索並用大寫字母替換字符串

for /f "delims=" %%a in ('dir /b/ad "o:\afstem*" ') do (

echo m | xcopy /t /e /y "o:\%%a\Ta" "b:\%%a\Ta" 

mkdir "b:\%%a\Nyta" 

echo f | xcopy /s /y /d "o:\%%a\Ta\*moms" "b:\%%a\Ta\*moms" 

SETLOCAL ENABLEDELAYEDEXPANSION 
SET String=%username% 

CALL :UpCase String 

set txtfile=o:\%%a\Ta\*.bat 
set newfile=b:\%%a\Ta\*.bat 
if exist "%newfile%" del /f /q "%newfile%" 
set search=SHL 
set replace=%String% 
for /f "tokens=*" %%a in (%txtfile%) do (
    set newline=%%a 
    call set newline=%%newline:%search%=%replace%%% 
    call echo %%newline%% >>%newfile% 
) 

ENDLOCAL 
GOTO:EOF) 


:UpCase 
:: Subroutine to convert a variable VALUE to all upper case. 
:: The argument for this subroutine is the variable NAME. 
SET %~1=!%1:a=A! 
SET %~1=!%1:b=B! 
SET %~1=!%1:c=C! 
SET %~1=!%1:d=D! 
SET %~1=!%1:e=E! 
SET %~1=!%1:f=F! 
SET %~1=!%1:g=G! 
SET %~1=!%1:h=H! 
SET %~1=!%1:i=I! 
SET %~1=!%1:j=J! 
SET %~1=!%1:k=K! 
SET %~1=!%1:l=L! 
SET %~1=!%1:m=M! 
SET %~1=!%1:n=N! 
SET %~1=!%1:o=O! 
SET %~1=!%1:p=P! 
SET %~1=!%1:q=Q! 
SET %~1=!%1:r=R! 
SET %~1=!%1:s=S! 
SET %~1=!%1:t=T! 
SET %~1=!%1:u=U! 
SET %~1=!%1:v=V! 
SET %~1=!%1:w=W! 
SET %~1=!%1:x=X! 
SET %~1=!%1:y=Y! 
SET %~1=!%1:z=Z! 
GOTO:EOF 

預先感謝您的任何幫助/建議

更新

由於梅德Sokolow下面的代碼解決了我的問題

set txtfile=o:\%%a\Ta\*.bat 
set newfileprefix=b:\%%a\Ta\ 
set search=SHL 
set replace=!String! 
for %%F in (!txtfile!) do (
    if exist "!newfileprefix!%%~nxF" del /f /q "!newfileprefix!%%~nxF" 
    for /f "tokens=*" %%Z in (%%F) do (
     set newline=%%Z 
     call set newline=%%newline:!search!=!replace!%% 
     echo !newline! >>!newfileprefix!~nx%%F 
    ) 
) 
+1

所以麻煩部分是90%的代碼...嘗試縮小它。 – wOxxOm

+1

您在大循環內有'GOTO:EOF',但'goto'斷開循環。 – wOxxOm

+0

謝謝,刪除了'GOTO:EOF'但仍然沒有成功 – Bris75

回答

0

for循環,你應該使用!var!獲得的var的實際價值,因此

set txtfile=o:\%%a\Ta\*.bat 
set newfile=b:\%%a\Ta\*.bat 
if exist "!newfile!" del /f /q "!newfile!" 
set search=SHL 
set replace=!String! 
for /f "tokens=*" %%Z in (!txtfile!) do (
    set newline=%%Z 
    call set newline=%%newline:!search!=!replace!%% 
    echo !newline! >>!newfile! 
) 

更新。

set txtfile=o:\%%a\Ta\*.bat 
set newfileprefix=b:\%%a\Ta\ 
... 
for %%F in (!txtfile!) do (
    for /f "tokens=*" %%Z in (%%F) do (
     set newline=%%Z 
     call set newline=%%newline:!search!=!replace!%% 
     echo !newline! >>!newfileprefix!%%F 
    ) 
) 
+0

謝謝,那肯定幫了很多忙。但仍然有一個問題。我很新的編程,所以我可能是錯的,但它似乎是一個問題'set txtfile = o:\ %% a \ Ta \ *。bat'也許set命令不能使用通配符? – Bris75

+0

'set txtfile = o:\ %% a \ Ta \ *。bat'設置文件掩碼。要通過掩碼處理文件,您需要另一個循環。查看更新。 –

+0

再次非常感謝你的幫助。我已經在代碼中製作了兩個工具來使其工作。在'echo!newline! >>!newfileprefix!%% F''%% F'指向路徑和文件名,所以我添加了'〜nx'來獲取文件名和擴展名。如果它已經存在,我也更改了刪除目標文件的代碼。請參閱更新。 – Bris75

相關問題