2013-11-15 21 views
0

这是一个后续行动,我的问题在这个线程问: Extracting string after last instance of delimiter in a Batch file对于Windows批处理文件循环:错误:“该命令的语法不正确”

我正在写一个批处理文件,从Java程序(它调用.bat)作为参数获取未知数目的字符串表示目录。这些目录保存在一个名为“dirs”的“数组”中。

for /F "tokens=2 delims==" %%z in ('set dirs[') do (
    set "parm=%~1" 
    for %%a in (%parm:\= %) do set folder=%%a 
    echo %folder% 
    shift 
) 

的“显示目录”阵列将就实际目录,而不以任何方式改变它,最终我将使用它作为XCOPY目录从被复制。 Parm将实际参数放入批处理文件中,并对其进行处理以提取目录的最后部分。名为“文件夹”的变量存储此目录名称并将其打印到命令行。但是,当我运行该程序时,我经常会收到一个错误,提示“命令的语法不正确”。我试图缩小问题出在哪里,而且它绝对在上面的循环中。为了让外环工作,%% z必须以某种方式操作吗?当我用简单的“echo %% z”替换它的内容时,循环就起作用,所以它让我想知道这是否是问题所在。

编辑:这里是更新的循环,用XCOPY线包括:

for /F "tokens=2 delims==" %%z in ('set dirs[') do (
set "param=%~1" 
set param=!param:\= ! 
for %%a in (!param!) do set lastDir=%%a 
    echo !lastDir! 
XCOPY %%z\*.* !outdrive!:\!dir!\!lastDir! /C /S /D /Y /I 
shift 
) 

在你需要知道,“outdrive”是一个外部硬盘驱动器的情况下,“dir”是以前创建的备份目录在程序中,lastDir应该是不言自明的。这是文件夹的名称,即“图片”或“文件”

最后编辑:

谢谢大家谁回答。我踢自己没有看到答案之前,但我已经找到了一些预期的代码。这里是循环,因为它目前是,正常操作:

for /F "tokens=2 delims==" %%z in ('set dirs[') do (
    set param=%%z 
    set param=!param:\= ! 
    for %%a in (!param!) do set lastDir=%%a 
    XCOPY %%z\*.* !outdrive!:\!dir!\!lastDir! /C /S /D /Y /I 
) 

而是使用批处理文件中传递的参数,我直接从“迪尔斯”阵列工作。然后,我为指定的目录字符串设置一个不同的变量,并对该变量进行操作,而不是存储在数组中的字符串。

+0

只是[今天回答](http://stackoverflow.com/a/20001130/2861476)。不是相同的代码,但相同的问题。请根据需要进行调整。 –

+0

而且,你为什么迭代dirs数组而不使用数据?而且,如果dirs数组已经从已经被移位迭代的参数中填充,那么参数被消耗,没有更多的参数,那么,%1会有什么值? –

+0

我将最终使用“dirs”数组,我已经调整了这个循环,以便进行调试。 “dirs”不是通过使用Shift迭代来填充的,我使用了一个稍微更复杂的系统来获取“dirs”数组的值,而无需操作批处理输入参数。至于链接,我明白他们在说什么,但我看不到我的哪些变量是在循环内部声明的,然后在内部进行更改。我在循环中使用的所有变量都是在循环内部创建的,所以我对链接中的代码如何相关有点困惑。 – DerStrom8

回答

1

根据更新的信息,这应该显示您需要的命令,并且在此代码段中不需要延迟扩展。

@echo off 
set outdrive=E 
set dir=backup 

set dirs[1]=c:\folders1 
set dirs[2]=c:\folders2 
set dirs[3]=c:\folders3 
set dirs[4]=c:\folders4 

for /F "tokens=2 delims==" %%z in ('set dirs[') do (
echo XCOPY "%%z\*.*" "%outdrive%:\%dir%\%%~nxz\" /C /S /D /Y /I 
) 
pause 
+0

非常感谢。我只看到一个问题,那就是我不知道“dirs”数组中有多少个目录,所以第一部分(set dirs [1] = .....)有点困难。我确实找到了一种方法来实现这一点,而且我正在踢自己,因为之前没有看到它。我即将添加它作为我的第一篇文章的编辑。非常感谢foxidrive,你一直在帮助我朝着正确的方向发展。 – DerStrom8

+0

我的循环中的代码完全符合您的最终编辑的要求 - 无需使用延迟扩展。 '%%〜nxz'是字符串中的最后一个文件夹(或文件名)。请参阅最后一页中的帮助** FOR /?** – foxidrive

+0

Woops,您绝对正确!该代码确实有效,除了我在命令窗口中不断收到错误,指出它找不到指定的驱动器。我似乎无法弄清楚它在哪里得到这个。我会做更多的挖掘工作,但是无论哪种方式,现在整体工作。非常感谢,我会接受这个答案=) – DerStrom8

2

如果您需要使用循环中的变量,请使用延迟扩展和!variables!的更改语法。

shift命令对循环变量没有任何作用。

+0

非常感谢你,“!”解决了这个问题。至于“转变”,你是对的,它没有做任何事情。有没有办法访问/转移循环内的变量? – DerStrom8

+0

将“shift”更改为“pause”,当您按下某个键时,它会显示每次通过。 – foxidrive

+0

这个批处理文件应该在没有任何用户输入的情况下运行,所以我不希望它依赖于监视命令行的用户。现在它只是一遍又一遍地打印图片(第一个目录),并且换档不起作用。我希望有一种方法可以做和shift一样的事情,以便我可以在循环的每次迭代中更改字符串。 – DerStrom8

相关问题