我想在Windows 7中实现批处理脚本,该脚本遍历文件夹中的所有文件,并且它会剪切文件夹前缀,例如: Folder =“C:\ A \ B \”,文件=“C:\ A \ B \ C \ D.E”应输出“C \ D.E”。我目前的代码如下:
setlocal ENABLEDELAYEDEXPANSION
SET DIRECTORY=C:\DEV\SVN\QA\
for /R %DIRECTORY% %%f in (*.*) do (
REM GET RELATIVE PATH
echo File=%%f
echo Path=%TARGET_PATH_FOR_SOURCE%
set result=%f:!TARGET_PATH_FOR_SOURCE!=%
echo Result=!result!
)
我得到以下结果:
File=C:\DEV\SVN\QA\1.0\A\B\C.txt
Path=C:\DEV\SVN\QA\1.0
Result=C:\DEV\SVN\QA\1.0= <<< Expected result: "A\B\C.txt"
我发现了这个here并在循环中尝试了这个但没有成功。你能帮帮我吗?
谢谢!
答案 0 :(得分:4)
这应该有用。
有必要将FOR循环参数复制到变量,因为替换操作仅适用于变量。
@echo off
setlocal EnableDelayedExpansion
SET DIRECTORY==C:\DEV\SVN\QA
set TARGET_PATH_FOR_SOURCE==C:\DEV\SVN\QA\1.0
echo Path=%TARGET_PATH_FOR_SOURCE%
for /R %DIRECTORY% %%x in (*.*) do (
REM GET RELATIVE PATH
set "file=%%x"
set result=!file:%TARGET_PATH_FOR_SOURCE%=!
echo Result=!result!
)
答案 1 :(得分:2)
指的是&#34; jeb&#34;的回答: 我头疼了好几个小时才能上班。显然它比预期容易。这样:
SET DIRECTORY==C:\DEV\SVN\QA
set TARGET_PATH_FOR_SOURCE==C:\DEV\SVN\QA\1.0
必须在没有&#34; ==&#34;:
的情况下编写set DIRECTORY=C:\DEV\SVN\QA
set TARGET_PATH_FOR_SOURCE=C:\DEV\SVN\QA\1.0
编辑: 好吧,事实证明我必须做更多。另外改变这个:
set result=!file:%TARGET_PATH_FOR_SOURCE%=!
对此,那应该没问题:
call set result=%%file:!TARGET_PATH_FOR_SOURCE!=%%