【问题标题】:extract part of file name using batch file使用批处理文件提取部分文件名
【发布时间】:2011-12-06 13:33:44
【问题描述】:

我有循环,我会将所有 *.txt 文件复制到同一目录中的 big.txt。在每个循环步骤中,我希望在不同文件夹中的不同文件的其他副本,文件名中的前三个字符与第一个目录中的文件相同。

例子:

\A\001.txt
\A\003.txt
\A\005.txt
\A\big.txt
\B\001_sth.xml
\B\002_sth.xml - don't copy! no 002 in folder A
\B\003_sth.xml
\B\004_sth.xml - don't copy! no 004 in folder A
\B\005_sth.xml
\B\big.xml

在第 1 步中:将 \A\001.txt 复制到 \A\big.txt 并将 \B\001_sth.xml 复制到 \B\big.xml 等等

我编写的批处理文件只复制目录A中的文件,但我不知道如何找到目录B中的文件。

@echo off
if "%1"=="" goto error 
for %%x in (%1\A\*.txt) do (
    copy %%x %1\A\big.txt
    echo %%x
    echo ---
)   

goto end    
:error
echo give me a directory    
:end

【问题讨论】:

    标签: windows command-line batch-file


    【解决方案1】:

    为什么不只枚举 A 中的文件,然后引用 B 中的文件?

    for %%I in (%1\A\*.txt) do (
        copy %1\B\%%~nI_sth.xml %1\B\big.xml
        echo %%I
        echo ---
    )   
    goto :EOF
    

    (顺便说一下,使用小写 x 作为循环变量是不明智的,因为 %%~sdfnx 都有特殊含义)

    【讨论】:

    • 什么是%%x?你的意思是%%I
    • 啊,我现在明白了,因为您使用 OP 的示例作为起点。抱歉问了一些愚蠢的问题。
    • 这就是我需要的:~n。谢谢!还要感谢您提供有关 %%x 的好提示。
    【解决方案2】:

    我不明白你的代码的目的。每次复制到 big.txt 时,都会覆盖之前的副本。我想你想追加。

    我不确定您是否要从空的 big.txt 和 big.xml 开始。我假设你会这样做。

    此外,您的问题暗示源文本文件的名称中可能包含超过 3 个字符,即使您的示例正好有 3 个字符。我假设您希望支持超过 3 个字符。

    如果我理解正确,我认为这会起作用(未经测试)编辑 - 对 Andriy M cmets 关于初始 setlocal 和避免自复制 big.txt 的响应进行了更改

    @echo off
    setlocal disableDelayedExpansion
    if "%~1"=="" echo Give me a directory&exit /b
    set "root=%~1"
    if exist "%root%\A\big.txt" del "%root%\A\big.txt"
    if exist "%root%\B\big.xml" del "%root%\B\big.xml"
    for /f "delims=" %%F in ('dir /b "%root%\A\*.txt"') do (
      type "%root%\A\%%~F" >>"%root%\A\big.txt"
      set "prefix=%%~nF"
      setlocal enableDelayedExpansion
      type "!root!\B\!prefix:~0,3!*.xml" >>"!root!\B\big.xml"
      endlocal
    )
    

    仅当! 出现在任何路径中时,才需要在循环内切换延迟扩展。由于这不太可能,您可以从启用延迟扩展开始并放弃切换。

    【讨论】:

    • 可能值得关注big.txt 作为%%F 的值,以防止尝试自我复制。
    • 我有一个问题:setlocal(不带参数)是否暗示setlocal DisableDelayedExpansion
    • 没有 arg 的 SETLOCAL 将等同于 SETLOCAL DisableDelayedExpansion 对于大多数环境,但最好是明确的。我编辑了答案。该解决方案将永远不会尝试自行复制 big.txt,因为它在开始循环之前已被删除。在执行 DO 块之前对 IN() 子句进行全面评估。
    • Re "IN() 子句在执行之前已被完全评估...":我会这么想,事实上我确实这么认为,直到我看到this question
    • 感谢SETLOCAL 的澄清,我不知道(一定错过了文档中的相关部分)。
    【解决方案3】:
    猜你喜欢
    • 1970-01-01
    • 2023-03-19
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多