使用非完整Windows文件路径批量获取文件的父目录

时间:2014-06-19 09:30:54

标签: svn batch-file

我正在尝试开发在svn。

的预先提交的基础上使用的脚本

以下是批次代码:

svn st | grep "M " | cut -c 8- > modified.txt
for /F "tokens=*" %%A in (modified.txt) do (
  if not %%A==. (
    if %%A==%%A (
      set "filepath=%%A" 
      for /f "delims==" %%F in (%filepath%) do (
        set "foldername=%%~nF"
        echo "Parent Found %foldername% from %filepath%..."
      )
      pause 
      del "\\<intranet share>\<folder>\%foldername%\%%A"
      svn export ".\%%A" "\\<intranet share>\<folder>\%foldername%"
    )
  )
)

输出如下:

  

C:\工作\&GT;(   
设置“foldername =”   
echo“发现于C:\ Work \ repo_path \ file_name.php ......”   )

如您所见,Found旁边的变量为空。问题在哪里?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

在块语句(a parenthesised series of statements)中,解析整个块并执行然后。块中的任何%var%将在解析块时被该变量的值替换 - 在块执行之前 - 同样的事情适用于{{1 }}

因此,FOR ... DO (block)将在遇到IF (something) else (somethingelse)时使用%variables%的值执行。

解决此问题的两种常见方法是1)使用IF并使用setlocal enabledelayedexpansion代替!var!来访问已更改的%var%或2}值以进行调用一个子程序,用于使用更改的值执行进一步处理。

因此,在for / f语句之前,在您拥有var的循环中的任何位置插入setlocal enabledelayedexpansion ,将其更改为%var%适用于元变量(循环控制变量)!var!%%A

另请注意,您的语句%%F - 现在if %%A==%%A...,如果cmd播放得很好,则应始终等于%%A,因此这似乎是一个多余的测试。 这个结构存在危险。由于您使用的是%%A,因此tokens=*可能包含一个分隔符 - 通常是一个空格。如果发生这种情况,%%A会看到cmd并且有相关信息。你可以使用if two words==two words...来防范这种情况。