Показать полную графическую версию : Применить ко всем файлам каталога.
luda-chel
20-01-2015, 08:13
Добрый день! подскажите решение вот такого вопроса:
Есть каталог например С:\DB\Post
В нем файлы. Нужно в каждм файле заменить 800 на 080.
написала для одногор файла:
@ECHO OFF
setlocal enabledelayedexpansion
SET ifile=1.txt
SET tfile=%ifile%.tmp
SET find=800
SET replace=080
IF EXIST %tfile% DEL /Q %tfile%
FOR /F "tokens=* delims=, " %%a IN (%ifile%) DO (
set line=%%a
set LINE=!LINE:%find%=%replace%!
echo !line!>> %tfile%
)
MOVE /Y %tfile% %ifile%
EXIT /B 0
Как изменить код, чтобы применялось не только для файла 1.txt, но и для остальных файлов в папке?
Нужно в каждм файле заменить 800 на 080. »
Пакетные файлы не особенно приспособлены для замены содержимого. Возьмите лучше PowerShell или, хотя бы, WSH.
Наподобие:
Get-ChildItem -Path "E:\Песочница\0425\*.*" |`
Where-Object -FilterScript {-not $_.PSIsContainer} |`
ForEach-Object -Process {
Set-Content -Path $_.FullName -Value ((Get-Content -Path $_.FullName) -replace "800", "080")
}
luda-chel
20-01-2015, 08:49
Спасибо за ответ.
Но ведь PowerShell для сервера. А мне с моего рабочего компьютера нужно. (про PowerShell почитала, ниразу не пользовалась)
А вот если через bat? как?
Но ведь PowerShell для сервера. »
Не только.
А мне с моего рабочего компьютера нужно. (про PowerShell почитала, ниразу не пользовалась) »
Поскольку, Вы не заполнили конфигурацию компьютера в своём профиле (http://forum.oszone.net/profile.php?do=specs) — можно только гадать. Если только на Вашем рабочем компьютере не установлена ОС Windows 2000 и ниже — PowerShell Вам доступен. С Vista и выше — в комплекте поставки, для Windows XP — в виде отдельной установки.
Сохраните приведённый код в файл с расширением «.ps1», заменив выделенное на Ваши данные. Однократно разрешите в PowerShell исполнение неподписанных скриптов (если не сделали этого ранее). Затем можете пробовать исполнять (лучше сделать копию каталога Ваших файлов и пробовать именно на копии).
А вот если через bat? как? »
Коллеги, которым подобное ещё не окончательно надоело ;), придут, напишут.
Коллеги, которым подобное ещё не окончательно надоело :wink:, придут, напишут. »
Не надоело: каждый день открытия:wink::).
@echo off
set "dir=C:\DB\Post"
set find=800
set replace=080
pushd "%dir%"
for /f "delims=" %%A in ('"2>nul dir/a-d/b"') do call:sub "%%A"
popd& exit/b 0
:sub
setlocal enabledelayedexpansion
for /f "tokens=* delims=, " %%a in ('type %1^& del %1') do (
set line=%%a
>>%1 echo(!line:%find%=%replace%!
)
endlocal& goto:eof
luda-chel
20-01-2015, 13:41
Iska, да. я уже почитала поглубже. поняла про PowerShell.
Georgio, попробую сейчас ваше предложение.
Мне тут на работе расскрыли полностью проблему. Оказывается:
1. Файлы переносятся из одной папки (1) во временную (Temp)
2. в них меняется информация
3. Переносятсяв другую папку (2)
Получается в папке 1 их больше нет. Но сервер каждые 1 минуту выкладывает в папку 1 новые файлы.
Если сделать цикл, и постоянно будет происходить перемещение, не получится ли так, что bat файл начнет перемещать файлик которые ещё не скопировался в 1 папку. имею ввиду совместный доступ к файлу.
Размер у них разный, названия то же, поэтому критерий выбрать никак нельзя.
Можно ли с помощью bat сделать ещё проверку занят ли файл каким то процессом (в нашем случае, перенос с сервера в папку 1) ?
вот как то так...
не получится ли так, что bat файл начнет перемещать файлик которые ещё не скопировался в 1 папку. имею ввиду совместный доступ к файлу. »
Теоретически сие вполне возможно.
По-хорошему, нужно добавлять в то же задание/приложение, которое осуществляет выкладку файла, добавить вызов скрипта/пакетного файла для замены содержимого этого одного файла.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.