извлечь часть имени файла, используя командный файл - PullRequest
2 голосов
/ 06 декабря 2011

У меня есть цикл, куда я скопирую все * .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

Ответы [ 3 ]

3 голосов
/ 06 декабря 2011

Почему бы просто не перечислить файлы в 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 имеют особое значение)

2 голосов
/ 07 декабря 2011

Я не понимаю цель вашего кода.Каждый раз, когда вы копируете в big.txt, вы перезаписываете предыдущую копию.Я думаю, что вы хотите добавить вместо этого.

Я не уверен, если вы хотите начать с пустого big.txt и big.xml.Я предполагаю, что вы делаете.

Кроме того, ваш вопрос подразумевает, что исходные текстовые файлы могут иметь более 3 символов в имени, даже если в вашем примере их ровно 3. Я предполагаю, что вы хотите поддерживать более3.

Если я вас правильно понимаю, я думаю, что это будет работать (не проверено) Редактировать - внесены изменения в ответ на комментарии Андрея М относительно начального 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
)

Переключение отложенного расширения в цикле необходимо только в том случае, если ! появляется в любом из путей.Поскольку это маловероятно, вы, вероятно, можете начать с отложенного расширения и сбросить переключение.

1 голос
/ 06 декабря 2011
...