1

Тема: CMD/BAT: Найти файл, изменить и сохранить

дано:  текстовый файл с именем file.xml,  путь к нему неизвестен.
задача :
1.найти файл file.xml,
2.создать резервную копию file.xml.bak  в том-же каталоге,
3.изменить в этом файле строку "12345=false" на "12345=true"
4.провести аналогичную операцию для всех найденных файлов

2

Re: CMD/BAT: Найти файл, изменить и сохранить

Будем выполнять все операции для диска "C" (для других дисков аналогично):

@echo off
for /f "delims=" %%i in ('dir "C:\file.xml" /a-d /b /s') do (
 echo %%i
 copy "%%i" "%%~i.bak">nul
 (
 for /f "tokens=1* delims=:" %%j in ('findstr /n "^" "%%i.bak"') do (
  if "%%k"=="12345=false" (
   echo 12345=true
) else (
   echo:%%k
  )
 )
 )>"%%i"
)
pause>nul
exit /b

.

3

Re: CMD/BAT: Найти файл, изменить и сохранить

спасибо, принцип понял
а искать сразу на всех существующих дисках невозможно ? т.е  надо запускать еще один цикл с перебором  дисков ?

4

Re: CMD/BAT: Найти файл, изменить и сохранить

Именно так.

5 (изменено: greg zakharov, 2014-04-17 09:37:00)

Re: CMD/BAT: Найти файл, изменить и сохранить

@echo off
  setlocal
    set "itm=%%ifile.xml"
    for /f "delims= " %%i in ('mountvol ^| findstr /ir [a-z]:\\') do (
      for /f %%j in ('2^>nul dir /a-d /b /s %itm%') do (
        echo %%j
      )
    )
  endlocal
exit /b

6 (изменено: Yury, 2014-06-12 14:48:23)

Re: CMD/BAT: Найти файл, изменить и сохранить

@echo off
for /f "tokens=2 delims==:" %%h in ('
 wmic logicaldisk get Name /value
') do (
 for /f "delims=" %%i in ('dir "%%h:\file.xml" /a-d /b /s') do (
  echo %%i
  copy "%%i" "%%~i.bak">nul
  (
  for /f "tokens=1* delims=:" %%j in ('findstr /n "^" "%%i.bak"') do (
   if "%%k"=="12345=false" (
    echo 12345=true
    ) else (
    echo:%%k
    )
   )
  )>"%%i"
  )
 )
pause>nul
exit /b

7

Re: CMD/BAT: Найти файл, изменить и сохранить

Еще один вариант без использования wmic.

@echo off
  setlocal enabledelayedexpansion
    set "map=ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    for /l %%i in (0, 1, 25) do (
      set "drv=!map:~%%i,1!"
      @!drv!: 2>nul && (
        for /f "tokens=*" %%j in ('2^>nul dir /a-d /b /s !drv!:file.xml') do echo "%%j"
      )
    )
  endlocal
exit /b

Правда стоит иметь в виду, что подобный подход, в отличии от использования mountvol или тормознутого wmic, не игнорирует диски, созданные командой subst.

8

Re: CMD/BAT: Найти файл, изменить и сохранить

Кстати, получить фиксированные диски можно и так:

@echo off
  setlocal
    for /f "tokens=3 delims= " %%i in ('echo list volume^
      ^| diskpart ^| findstr /ir ђ §¤Ґ«') do (
      for /f %%j in ('2^>nul dir /a-d /b /s %%i:\file.xml') do (
        copy "%%j" "%%~dpnj.bak">nul
        ...
      )
    )
  endlocal
exit /b

Или, если у пользователя нет прав администратора:

@echo off
  setlocal enabledelayedexpansion
    ::getting harddrives
    set "i=0"
    for /f "tokens=1,3" %%i in ('reg query HKLM\SYSTEM\MountedDevices^
     ^| findstr /ir DosDevices ^| sort') do (
      set "chk=%%~j"
      if "!chk:~0,2!" equ "EC" (
        for /f "tokens=2 delims=\" %%k in ("%%i") do (
          set "arr.!i!=%%k\" & set /a "i+=1"
        )
      )
    )
    ::searching file
    set /a "len=%i% - 1"
    for /l %%i in (0, 1, !len!) do (
      for /f %%j in ('2^>nul dir /a-d /b /s !arr.%%i!file.xml') do (
        copy "%%j" "%%~dpnj.bak">nul
        ...
      )
    )
  endlocal
exit /b

Вариантов много.