批处理文件 - 在函数内搜索和替换函数参数时遇到问题

问题描述 投票:0回答:1

我有以下批处理文件:

@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\=!

我做错了什么?

string for-loop batch-file replace
1个回答
0
投票
@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\=!"
© www.soinside.com 2019 - 2024. All rights reserved.