我正在尝试开发在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
旁边的变量为空。问题在哪里?
感谢您的帮助。
答案 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...
来防范这种情况。