【问题标题】:Batch-script for determining relative paths in a loop用于确定循环中相对路径的批处理脚本
【发布时间】:2013-11-25 21:08:22
【问题描述】:

我想在 Windows 7 中实现一个批处理脚本,该脚本遍历文件夹中的所有文件并剪切文件夹前缀,例如文件夹 = "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 并在循环中尝试了这个但没有成功。你能帮帮我吗?

谢谢!

【问题讨论】:

  • 选择了错误的语言。德语:Ist dir aufgefallen, dass dies ein englisch sprachiges Forum ist?
  • Ich habe hier schon einige Fragen gefunden,死在 deutsch formuliert wurden。
  • 这个问题是题外话,因为它不是英文的
  • 我已经翻译好了!我看到一些德语问题。所以我认为用德语写是可以的,对不起!这是我的第一篇文章。
  • 您正在尝试使用 FOR 变量进行 SET 扩展。那是行不通的。使用 Set File=%%f 和 !File:!TARGET_PATH_FOR_SOURCE!=!而是。

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


【解决方案1】:

参考“jeb”的回答: 为了让它工作,我头疼了好几个小时。显然这比预期的要容易。这个:

SET DIRECTORY==C:\DEV\SVN\QA
set TARGET_PATH_FOR_SOURCE==C:\DEV\SVN\QA\1.0

必须不带“==”:

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

【讨论】:

    【解决方案2】:

    这应该可行。

    必须将 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!
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-04
      • 2011-02-05
      • 1970-01-01
      • 2014-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多