另一个变量中的批变量名称

时间:2015-12-14 14:29:48

标签: batch-file

假设我有一个文件夹,其中包含我不一定了解的其他文件夹:

|Folder
|      |-- SubFolder1
|      |-- SubFolder2
|      |-- SubFolder3

我基本上想要为子文件夹映射另一个位置。所以我创建了另一个包含这些子文件夹名称的批处理文件,这些文件名可以设置另一个位置,例如:

TYPE NUL > folders.cmd
FOR /D %%i IN (*) DO (@ECHO SET %%i=>>folders.cmd)

产生:

SET SubFolder1=
SET SubFolder2=
SET SubFolder3=

然后,如果我要打开该文件并设置一些像这样的值:

SET SubFolder1=C:\test1
SET SubFolder2=C:\test2
SET SubFolder3=C:\test3

我现在如何访问批处理文件中的变量/值(特别是当我可能不知道它们是什么时)。

我想也许我可以这样做:

CALL folders.cmd
FOR /D %%i IN (*) DO (
    @ECHO %%%i%%%
)

但这似乎是不正确的做法。

3 个答案:

答案 0 :(得分:1)

您在此问题中使用的概念称为 array 。您可以使用this post中描述的方法来访问数组元素。例如:

SETLOCAL ENABLEDELAYEDEXPANSION

CALL folders.cmd
FOR /D %%i IN (*) DO (
    ECHO !%%i!
)

......或:

CALL folders.cmd
FOR /D %%i IN (*) DO (
    CALL ECHO %%%%i%%
)

编辑添加了CALL示例的输出

C:\> dir /B
folders.cmd
SubFolder1
SubFolder2
SubFolder3
test.bat

C:\> type folders.cmd
SET SubFolder1=C:\test1
SET SubFolder2=C:\test2
SET SubFolder3=C:\test3

C:\> type test.bat
@echo off
setlocal

CALL folders.cmd
FOR /D %%i IN (*) DO (
    CALL ECHO %%%%i%%
)

C:\> test.bat
C:\test1
C:\test2
C:\test3

答案 1 :(得分:0)

不要将循环变量与环境变量混合,因为它们是两种不同类型的变量。

目前还不清楚你最终想要实现的目标。但是对于您的示例,以下批处理代码会生成folders.cmd您最终想要的内容。

@ECHO OFF
SETLOCAL EnableDelayedExpansion
DEL folders.cmd 2>nul
FOR /D %%i IN (*) DO (
    SET "FolderName=%%i"
    SET "FolderNumber=!FolderName:~-1!
    ECHO SET "%%i=C:\test!FolderNumber!">>folders.cmd
)
TYPE folders.cmd
ENDLOCAL
PAUSE

输出结果为:

SET "SubFolder1=C:\test1"
SET "SubFolder2=C:\test2"
SET "SubFolder3=C:\test3"

第二个 SET 从当前文件夹名称获取最后一个字符。

或许对你非常不明确的任务更好:

@ECHO OFF
SETLOCAL EnableDelayedExpansion
DEL folders.cmd 2>nul
SET "FolderCount=0"
FOR /D %%i IN (*) DO (
    SET /A FolderCount+=1
    ECHO SET "%%i=C:\test!FolderCount!">>folders.cmd
)
TYPE folders.cmd
ENDLOCAL
PAUSE

此代码将带有递增编号的C:\test写入其他批处理文件。

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • del /?
  • echo /?
  • endlocal /?
  • for /?
  • pause /?
  • set /?
  • setlocal /?
  • type /?

答案 2 :(得分:0)

如果您的文件folders.cmd包含:

SET SubFolder1=C:\test1
SET SubFolder2=C:\test2
SET SubFolder3=C:\test3

我会使用这段代码:

for /F "tokens=3 delims== " %%a in (folders.cmd) do echo %%a

哪会产生输出:

C:\test1
C:\test2
C:\test3

更完整的命令是:

for /F "tokens=2,3 delims== " %%a in (folders.cmd) do echo %%a maps to %%b

输出:

SubFolder1 maps to C:\test1
SubFolder2 maps to C:\test2
SubFolder3 maps to C:\test3
相关问题