用于确定循环中相对路径的批处理脚本

时间:2013-11-13 10:06:43

标签: shell batch-file command-line windows-7

我想在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并在循环中尝试了这个但没有成功。你能帮帮我吗?

谢谢!

2 个答案:

答案 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!=%%