我正在尝试编写一个批处理文件来调用另一个替换目录中的两个文件的批处理文件。这是我的代码:
set mmcIpath="C:"*"\mmc-stable-win32\MultiMC\instances"
call C:\%mmcIpath%\spc_we_replace_CED+CEDU.bat
每当我设置临时环境变量时,它都说无法找到目录。
- 附加信息 -
我运行一个名为MultiMC5的Minecraft发射器;它有一个运行命令的功能 - 但由于某种原因只有一个命令。所以我希望它调用一个批处理文件来运行多个命令。
我的主要批处理文件位于" C:... \ MultiMC \ instances",但我希望程序能够调用它。它不能,因为它在名为" CED(210 mods - )"的子目录中工作。所以我在子目录中放了另一个批处理来调用主要的(我想对第二个名为" CEDU(300+ mods - )")的子目录做同样的事情。我收到了这个错误:"系统找不到指定的路径。"。它发生在我设置路径。
时我使用Windows 8.1并搜索了有关如何使用通配符以及如何使用FOR循环的提示,但没有一个通配符方法对我有效,我根本无法理解FOR循环。我也尝试删除并添加引号之类的东西以试图修复它,但这也没有用。
我的问题:
set命令是否与通配符兼容?如果是,我该如何使其工作?
答案 0 :(得分:0)
看起来您的问题是主批处理文件可以位于任何驱动器上,并且您希望使用相对于主批处理文件位置的路径调用其他批处理文件。这是对的吗?
您可以使用%~d0
获取驱动器,使用%~p0
获取路径,使用%~dp0
获取驱动器+路径。请参阅下面的示例并执行存储在多个不同目录中的此小批处理文件:
@echo off
echo Batch is stored on drive %~d0
echo in the directory %~p0
echo resulting in path %~dp0
因此,您可以使用包含完整路径的批处理文件名称的%0引用的参数0,使用在命令提示符窗口中输入FOR
时显示的命令for /?
的帮助中解释的上述语法使用路径调用其他批处理文件,具体取决于主批处理文件的路径。
答案 1 :(得分:0)
现在我们在这里有一个经典的XY problem - 被问及一个解决方案,而不是潜在的问题。
这是一个可能的解决方案:
@ECHO OFF
SETLOCAL
set mmcIpath="C:"*"\mmc-stable-win32\MultiMC\instances"
set "mmcIpath=U:\\.*\\mmc-stable-win32\\MultiMC\\instances"
SET "targetbat=spc_we_replace.bat"
FOR /f "delims=" %%a IN (
'dir /b/s /ad "%mmcIpath:~0,3%"^|findstr /e /i /r /c:"%mmcIpath%" '
) DO (
IF EXIST "%%a\%targetbat%" (
ECHO CALL "%%a\%targetbat%"
ECHO GOTO nextstep
)
)
:nextstep
GOTO :EOF
我已将mmcIpath
的原始设置保留在原位,并将其替换为适合我系统的表单。
方法是执行dir/s/b/ad
命令(目录,基本格式,仅包含子目录,目录名称)并使用findstr
对其进行过滤。我选择了switch /i
(不区分大小写)/e
(必须以字符串结尾)/r
regular-expression /c:
(以下是一个要匹配的字符串)。
正则表达式是根据findstr
的规则构建的 - 如果要将\
用作文字,则.*
需要加倍; call
表示“任意数量的任何字符”
这应提供通过过滤器的文字目录名列表。查找找到的文件名目录,ECHO
目标文件(如果找到)。为了测试目的,所需的CALL命令仅为ECHO CALL
。 在您确认命令正确后,将CALL
更改为ECHO GOTO
以实际执行文件。
以下U:
表示如果需要,可以在找到第一个目标文件后断开循环。你还没有表明你是想只运行第一个目标还是运行所有找到的目标。
这是我的测试来源。我使用@ECHO OFF
SETLOCAL
SETLOCAL ENABLEDELAYEDEXPANSION
set "mmcIpath=\mmc-stable-win32\MultiMC\instances"
FOR /l %%a IN (1,1,4) DO MD u:\%%a%mmcIpath% 2>nul
FOR /l %%a IN (2,2,4) DO COPY NUL u:\%%a%mmcIpath%\spc_we_replace.bat 2>NUL >nul
ENDLOCAL
ENDLOCAL
@ECHO OFF
SETLOCAL
set mmcIpath="C:"*"\mmc-stable-win32\MultiMC\instances"
set "mmcIpath=U:\\.*\\mmc-stable-win32\\MultiMC\\instances"
SET "targetbat=spc_we_replace.bat"
FOR /f "delims=" %%a IN (
'dir /b/s /ad "%mmcIpath:~0,3%"^|findstr /e /i /r /c:"%mmcIpath%" '
) DO (
IF EXIST "%%a\%targetbat%" (
ECHO CALL "%%a\%targetbat%"
ECHO GOTO nextstep
)
)
:nextstep
GOTO :EOF
来测试数据。您的系统可能会有所不同。
u:\1\mmc-stable-win32\MultiMC\instances
请注意,第一部分只是建立u:\4\mmc-stable-win32\MultiMC\instances
到spc_we_replace.bat
,然后在u:\2\mmc-stable-win32\MultiMC\instances
和u:\4\mmc-stable-win32\MultiMC\instances
中创建一个虚拟文件mmcIath
。
第二部分中分配给findstr
的字符串符合\
的语法规则 - 每个.*
加倍,"%mmcIpath:~0,3%"
表示“任意数字的任意字符”。您必须修改该字符串以适合您的系统。请注意U:\
无偿地从字符串中获取前3个字符。就我而言,那将是{{1}}。 YMMV