这是我在这个帖子中提出的问题的后续跟进: Extracting string after last instance of delimiter in a Batch file
我正在编写一个批处理文件,该文件使用未知数量的字符串表示来自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
)
“dirs”数组将保留实际目录而不以任何方式更改它,最终我将使用xcopy作为要复制的目录。 Parm将实际参数放入批处理文件中并对其进行操作以提取目录的最后部分。名为“folder”的变量存储此目录名称并将其打印到命令行。但是,当我运行程序时,我经常会收到一条错误,说“命令的语法不正确”。我试着缩小问题的确切位置,并且它肯定在上面的循环中。为了使外循环工作,%% 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
)
我没有使用传递给批处理文件的参数,而是直接使用“dirs”数组。然后我将一个不同的变量设置为指定的目录字符串,并对该变量进行操作,而不是存储在数组中的字符串。
答案 0 :(得分:2)
如果需要在循环中使用变量,请使用延迟扩展和!variables!
的更改语法。
shift
命令对循环变量没有任何作用。
答案 1 :(得分: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