2015-03-02 55 views
0

我需要這樣做,使得文件與替換的字符重新命名爲幾千名的名單上替換字符出現的所有的文件名。目的是允許以下腳本運行在所有名稱上BAT文件與另一

問題是帶有「&」符號的名稱。

我使用這個腳本查找包含幾千名必須加以反對全面的文件找到剛纔在名單上的那些多個文件夾運行列表中的所有文件名。如果發現我可以將文件複製或移動到閃存驅動器上。

除了包含「&」的名稱外,該腳本完美地工作。不幸的是有不少。除了在搜索過程中找到逃避&的方法之外,我可以用任何獨特的單詞或字符替換它,足以運行搜索,並在找到文件後將其顛倒。

最初的劇本是這樣的:

set list=C:\ALIST.txt 
pushd %source% 
for /f "tokens=*" %%a in (%list%) do (echo.%%a && call :FindIt "%%~a") 
goto :End 

:FindIt 
for /f "tokens=* usebackq" %%b in (`dir /b /s /a-d-s-h "%~1"`) do (call :DoIt "%%~dpb" "%~1") 
goto :EOF 

:DoIt 
set str=%~1 
set str=%str:~0,-1% 
set file=%~2 
rem NOTE: ADD /MOV at end of next line to move instead of COPY 
robocopy "%str%" "%dest%" "%file%" 
goto :EOF 

:End 
popd 

這是寫的一個很好的朋友,我不採取信貸爲他的工作。 我到處尋找一種方法來做到這一點,他的腳本是天賜良機,讓我有95%的結局。它唯一的問題是讓它接受帶有「&」符號的名稱,或者找到一種方法暫時替換「&」符號,以便運行該腳本。

任何意見或替代讚賞

回答

1

的問題似乎缺少引號

set "str=%~1" 
set "str=%str:~0,-1%" 
set "file=%~2" 

但是,沒有充分了解如何/爲什麼這樣做這樣(或許應該更短),在完整的代碼可寫爲

pushd %source% && (
    for /f "tokens=*" %%a in (%list%) do (
     echo(%%a 
     for /f "delims=" %%b in (' 
      dir /b /s /a-d-s-h "%%~a" 
     ') do robocopy "%%~dpb\." "%dest%" "%%~a" 
    ) 
    popd 
) 

沒有call並且沒有子字符串操作。

0

這似乎很好地工作,但我不能保證空格和特殊字符。將其放置在一個名爲的文件中This.hat.and.other.other.bat

@echo off 
setlocal EnableDelayedExpansion 
set src=%~n0 
set "tgt=%src:.=!p! " & call set "tgt=!tgt!%" 
@echo %src% 
@echo %tgt% 
endlocal 
相關問題