批处理文件替换某些字符

时间:2013-04-17 13:18:28

标签: batch-file

我只是在为文本文件中的每一行复制文件夹结构时完成我的脚本。我们想要一个包含每个客户的子文件夹的文件夹。客户"测试"文件夹应放在\ path \ e $ \ Relaties \ T \ Test中。因此,对于每个简历,一个特定的文件夹,其余的,如数字或字符," _Overig" (其他)文件夹。

这一切都很好,但是我遇到了像%* / \和#39;这样的特殊字符的问题。 "等等。 在下面的示例中,我想删除foldername中的所有,因为Windows不支持它。我用set var =!var2: =来做这个!但它不起作用。此外,当文本文件中的一行包含!时,脚本也会崩溃。我可以通过放^来逃避它! instedad!在批处理文件中,但由于它是由我们的内部网生成的,我希望下面的批处理文件只是为了处理它而自行转义它。

请帮帮我。

setlocal EnableDelayedExpansion
set file=E:\list.txt

FOR /F "delims=~" %%i IN (!file!) DO (

echo %%i

set var2=%%i
set var=!var2:*=!

set str=!var:~0,1!
IF /i !str!==A ( set letter=1&&set str=A)
IF /i !str!==B ( set letter=1&&set str=B)
IF /i !str!==C ( set letter=1&&set str=C)
IF /i !str!==D ( set letter=1&&set str=D)
IF /i !str!==E ( set letter=1&&set str=E)
IF /i !str!==F ( set letter=1&&set str=F)
IF /i !str!==G ( set letter=1&&set str=G)
IF /i !str!==H ( set letter=1&&set str=H)
IF /i !str!==I ( set letter=1&&set str=I)
IF /i !str!==J ( set letter=1&&set str=J)
IF /i !str!==K ( set letter=1&&set str=K)
IF /i !str!==L ( set letter=1&&set str=L)
IF /i !str!==M ( set letter=1&&set str=M)
IF /i !str!==N ( set letter=1&&set str=N)
IF /i !str!==O ( set letter=1&&set str=O)
IF /i !str!==P ( set letter=1&&set str=P)
IF /i !str!==Q ( set letter=1&&set str=Q)
IF /i !str!==R ( set letter=1&&set str=R)
IF /i !str!==S ( set letter=1&&set str=S)
IF /i !str!==T ( set letter=1&&set str=T)
IF /i !str!==U ( set letter=1&&set str=U)
IF /i !str!==V ( set letter=1&&set str=V)
IF /i !str!==W ( set letter=1&&set str=W)
IF /i !str!==X ( set letter=1&&set str=X)
IF /i !str!==Y ( set letter=1&&set str=Y)
IF /i !str!==Z ( set letter=1&&set str=Z)

IF !letter!==1 ( set pad=\\fs1\e$\Data\Relaties\!str!\!var!) ELSE (set pad=\\fs1\e$\Data\Relaties\_Overig\!var!)
set oudpad=\\fs1\e$\Data\Klanten\!var!
xcopy "\\fs1\e$\Data\Relaties\_template\_template" "!pad!" /T /E /O /I

robocopy "!oudpad!\adviesrapporten" "!pad!\Documentatie\Adviesrapporten" /ZB /COPY:DAT /R:3 /W:1

set letter=0

)

编辑:

使用固定星号的东西     set var =!var:** =!

但是,如果我想要一个带有!的foldername!在其中,脚本忽略它。

1 个答案:

答案 0 :(得分:1)

好的 - 试试这个:

@ECHO OFF
SETLOCAL
FOR /f "delims=" %%i IN (E:\list.txt) DO (
 ECHO "%%i"|FINDSTR /i /b /r .[a-z] >nul
IF ERRORLEVEL 1 (set letter=_Overig) ELSE (SET letter=%%i&CALL SET letter=%%letter:~0,1%%)
SET var=%%~i
CALL :transmute
)
GOTO :eof

:transmute
SETLOCAL enabledelayedexpansion
SET var=!var:^|=!
SET var=!var:^>=!
SET var=!var:^<=!
SET var=!var:%%=!
SET var=!var:^&=!
endlocal&SET var=%var%
SET var=%var:?=%
SET var=%var::=%
SET var=%var:[=%
SET var=%var:]=%
SET var=%var:`=%
SET var=%var:'=%
SET var=%var:{=%
SET var=%var:}=%
SET var=%var:/=%
SET var=%var:\=%
SET nvar=%var:"=%
SET "var="
:tmlp
IF NOT "%nvar:~0,1%"=="*" IF NOT "%nvar:~0,1%"=="=" SET var=%var%%nvar:~0,1%
SET nvar=%nvar:~1%
IF DEFINED nvar GOTO tmlp
SET pad=\\fs1\e$\Data\Relaties\%letter%\%var%
set oudpad=\\fs1\e$\Data\Klanten\%var%
ECHO XCOPY "\\fs1\e$\Data\Relaties\_template\_template" "%pad%" /T /E /O /I
ECHO robocopy "%oudpad%\adviesrapporten" "%pad%\Documentatie\Adviesrapporten" /ZB /COPY:DAT /R:3 /W:1

GOTO :eof

至少不会在数据文件上崩溃

name 1
allo! allo!
"good grief!"
@last!
%percents-problem or not?%
how about ^carets?
NOT carrots
(what does this do?)
)and what about this?
;semi to start?
-dash
^caret?
^^double-caret?
&ampersand schmooze
!now this is a test!!
=can be skipped
:colon, of course
    and ever-loving spaces
*s fell on stockton
9" nails
|pipe?
?question mark??
>greater?
<less??
.dot
,comma
12345
`that's all
o'connor
]close-square
[open-square
{and brace-open
}or close
/slash
\slosh

基本上,在检查行以字母开头后,按下每个名称以删除笨拙的字符,最终显示名称和目录。

XCOPYROBOCOPY均未激活;检查后你需要删除前面的ECHO