假设我有一个文件夹,其中包含我不一定了解的其他文件夹:
|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%%%
)
但这似乎是不正确的做法。
答案 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