【发布时间】:2013-11-15 20:35:34
【问题描述】:
这是我在此线程中提出的问题的后续行动: 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 将实际参数放入批处理文件并对其进行操作以提取目录的最后一部分。名为“文件夹”的变量存储此目录名称并将其打印到命令行。但是,当我运行程序时,我经常收到一条错误消息,提示“命令的语法不正确”。我尝试缩小问题的确切位置,并且肯定在上述循环内。为了使外循环工作,是否必须以某种方式操作 %%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”数组工作。然后,我将一个不同的变量设置为指定的目录字符串,并对该变量进行操作,而不是存储在数组中的字符串。
【问题讨论】:
-
只是answered today。不是相同的代码,而是相同的问题。请根据需要进行调整。
-
还有,为什么要遍历 dirs 数组而不使用数据?并且,如果 dirs 数组已从通过 shift 迭代检索的参数填充,则使用参数,不再使用参数,那么 %1 将具有什么值?
-
我最终将使用“dirs”数组,此时我已经修剪了循环以进行调试。 “dirs”不是通过使用 Shift 迭代来填充的,我使用了一个稍微复杂的系统来获取“dirs”数组的值,而无需操作批处理输入参数。至于链接,我明白他们在说什么,但我没有看到我的哪些变量是在循环之外声明的,然后在循环内部进行了更改。我在循环内使用的所有变量都是在循环内创建的,所以我对链接中的代码之间的关系有点困惑。
-
在第一次使用
!var!构造之前的某个时间,您需要一行SETLOCAL ENABLEDELAYEDEXPANSION来激活delayedexpansion模式。直接在@echo off之后就可以了。SHIFT在这种情况下无效。它移动过程参数的索引。 -
我的程序顶部确实有该行。我刚刚让我的程序开始工作,我会将最终循环作为第二次编辑发布在我的主帖中,以供未来的读者阅读。谢谢大家的帮助!
标签: batch-file syntax command