通过修剪其他变量的内容来设置变量



我有一个问题,我需要标题中的代码。 脚本的目的:我需要使用不同的语言代码复制文件,例如XXX_x_xYYY_EN_xx XXX_x_xYYY_ES_xx和XXX_x_xYYY_DE_xx。到目前为止,我有这个,但它不起作用:

setlocal enableDelayedExpansion
for /l %%H in (1,1,2) do (
set endf[%%H]=!fName[%%H]:*_EN_=!
set trim[%%H]=_EN_!endf[%%H]!
set beginf[%%H]=!fName[%%H]:%trim[%%H]%=!
)

fName是这样设置的,它是这样的fName[1]=XXX_x_xYYY_EN_xxfName[2]=XXXXX_x_xYYYY_EN_x除了集合 beginf(它吐出"beginf[1]=fName[1]:=">(,我尝试了无数的 %nad! 组合。有趣的是,它在这种情况下有效(其他脚本,相同的木偶,但仅适用于目录中的一个文件,我想使其更通用(:

set beginf=!NAME:%langcode%=!

帮助:)谢谢!

所以你对两个数组元素有两个不同的转换,不是吗?因此,您只需要将每个文件名与其相应的转换相匹配,对吗?

也许是这样的东西?

set "conv[1]=ES"
set "conv[2]=DE"
for /l %%H in (1,1,2) do (
for %%c in (!conv[%%H]!) do set "newName[%%H]=!fName[%%H]:_EN_=_%%c_!"
)

我建议你阅读这个答案。

编辑添加了新方法

此代码与您发布的答案中的代码完全相同

@echo off
setlocal EnableDelayedExpansion
for %%a in (*.xml) do (
set "fName=%%a"
for %%c in (ES DE PL) do (
copy "%%a" "!fName:_EN_=_%%c_!"
)
)

您的代码与此代码的比较:

  • 您真的不需要文件名数组。如果您创建数组只是为了处理一次其元素而不进行进一步处理,那么您正在浪费数组占用的空间。您可以使用单个文件名变量执行相同的操作。
  • 此外,您不需要一系列转换。如果您只想重复具有多次转换的命令,那么使用转换列表要简单得多。
  • 使用特殊字符作为 FOR 可替换参数(文档中指定了一个字母(是一个坏主意。批处理文件本质上是神秘的,因此无需包含额外的复杂性......
  • 如果您只想处理所有文件(不重命名它们(,那么在'dir /B'命令上使用纯for命令而不是for /F命令更简单。第二种形式需要执行cmd.exe程序的附加副本并创建一个临时磁盘文件...
  • 如果newfName(数组(变量仅用于执行下一行中的copy命令,那么这样的变量(再次(浪费空间。您可以在copy命令本身中创建新名称。

我找到了解决方案:) 文件计数的完整脚本如下:

@echo off
setlocal enableDelayedExpansion
set /a count=0
for /f %%# in ('dir *.xml /b') do (
set /a count+=1
set fName[!count!]=%%~xn#
)
set "conv[1]=ES"
set "conv[2]=DE"
set "conv[3]=PL"
for /l %%H in (1,1,!count!) do (
for /l %%G in (1,1,3) do (
for %%c in (!conv[%%G]!) do (
set "newfName[%%G]=!fName[%%H]:_EN_=_%%c_!"
copy !fName[%%H]! !newfName[%%G]!
)
)   
)

循环说明:

对于/l %%H -循环遍历 fName 数组

对于/l %%G- 循环遍历 lang 表 (conv( 数组

对于 %%c- 合并上述循环并复制具有更改名称的文件

感谢您@Aacini的投入,它使我走上了正确的轨道:)

最新更新