我有以下批处理文件:
@echo off
setlocal enabledelayedexpansion
set "ChosenFolder="
for /r /d %%f in (.) do call :function "%%f"
goto end
:function
echo %%~1: %~1
set "ChosenFolder=!%~1:*\web\=!"
echo ChosenFolder: %ChosenFolder%
:end
批处理文件位于
c:\docs\webs\my website name\web\
。它应该遍历每个子文件夹并生成每个文件夹的相对路径,通过 \web\
剥离所有内容的每个路径。总共有两个子文件夹,apples
和 apples\oranges
,所以输出应该是这样的:
%~1: c:\docs\webs\my website name\web\.
ChosenFolder: \.
%~1: c:\docs\webs\my website name\web\apples\.
ChosenFolder: apples\.
%~1: c:\docs\webs\my website name\web\apples\oranges\.
ChosenFolder: apples\oranges\.
但是,这就是我得到的:
%~1: c:\docs\webs\my website name\web\.
ChosenFolder: c:\docs\webs\my website name\web\.:*\web\=!
%~1: c:\docs\webs\my website name\web\apples\.
ChosenFolder: c:\docs\webs\my website name\web\apples\.:*\web\=!
%~1: c:\docs\webs\my website name\web\apples\oranges\.:*\web\=!
ChosenFolder: c:\docs\webs\my website name\web\apples\oranges\.:*\web\=!
我做错了什么?
@ECHO OFF
SETLOCAL
set "ChosenFolder="
for %%e in (
"c:\docs\webs\my website name\web\."
"c:\docs\webs\my website name\web\apples\."
"c:\docs\webs\my website name\web\apples\oranges\."
) do call :function "%%~e"
goto end
:function
echo %%~1: %~1
set "ChosenFolder=%~1"
SET "chosenfolder=%chosenfolder:*\web\=%"
echo ChosenFolder: %ChosenFolder%
:end
注意:我在一个简单的
for
循环中使用了您指定的目录名称进行测试,因此引用了元变量 %%e
并且可以“裸露”传递,或者如我所展示的那样,取消引用和引用。
I prefer to avoid ADFNPSTXZ (in either case) as metavariables (loop-control variables)
ADFNPSTXZ are also metavariable-modifiers which can lead to difficult-to-find bugs
(See `for/f` from the prompt for documentation)
您的代码的问题是子字符串化仅适用于普通变量,不适用于元变量。
另请注意,
delayedexpansion
不是必需的,除非您选择使用单行
set "ChosenFolder=%~1"&SET "chosenfolder=!chosenfolder:*\web\=!"