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

时间:2018-10-22 17:49:53

标签: batch-file

我有问题,我需要标题中的代码。脚本的目的:我需要使用其他语言代码(例如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 设置为elswere,类似这样 fName [1] = XXX_x_xYYY_EN_xx fName [2] = XXXXX_x_xYYYY_EN_x 除了 set beginf (它弹出“ beginf [1] = fName [1]:=” )之类的东西外,其他所有东西都有效,我尝试了无数%< / em> nad 组合。有趣的是,它在这种情况下可以工作(其他脚本,相同的puprose,但仅适用于目录中的一个文件,我想使其更通用):

set beginf=!NAME:%langcode%=!

帮助:)谢谢!

2 个答案:

答案 0 :(得分:1)

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

也许是这样?

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_!"
)

我建议您阅读this answer

编辑添加了新方法

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

@echo off
setlocal EnableDelayedExpansion

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

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

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

答案 1 :(得分:0)

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

@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)数组

for %% c -结合以上循环并复制名称更改的文件

感谢@Aacini的输入,它使我进入了正确的轨道:)