Скрипт не захватывает восклицательный знак из текста
Имеется скрипт, который ищет строку из %FindFile% в файле %infile%, в котором присутствует символ ! (восклицательный знак)
Код:
@echo off
SetLocal EnableExtensions EnableDelayedExpansion
For /F "Tokens=3 Delims=," %%A in ('wmic /NODE:localhost path win32_operatingsystem get LocalDateTime^, CurrentTimeZone /FORMAT:CSV') do (Set st=%%A)
Set YYYY=%st:~0,4%
Set MM=%st:~4,2%
Set FindFile=old_date.txt
Set infile=infile.txt
Set TmpFile="%infile%.tmp"
Set outFile="%infile%"
if exist %FindFile% ( Set /p find=< %FindFile%
) else Set find=2014.05
Set replace=%YYYY%.%MM%
for /F "UseBackQ delims=" %%n in ("%infile%") do (
set "LINE=%%n"
echo=!LINE:%find%=%replace%!>>"%TmpFile%"
)
move /y %TmpFile% %outFile%
del /f /q %FindFile%
echo %replace%>> %FindFile%
endlocal
После применения скрипта все восклицательные знаки исчезают в небытие.
Некоторые части скрипта находил гуглением.
Помогите, пожалуйста.
|
R3m, это связано с тем, что символ «!» при включённом отложенном раскрытии переменных окружения («setlocal … enabledelayedexpansion») имеет специальное значение.
Опишите детально, что делает/должен делать пакетный файл.
P.S. «/NODE:localhost» лишнее. «path win32_operatingsystem» можно просто заменить псевдонимом «OS».
|
Iska, скрипт ищет дату (YYYY.MM), заданную в файле %FindFile%, в файле %infile% и заменяет ее на текущую.
%infile% - основной скрипт WPI.hta. смена даты необходима из-за ежемесячного (а то и чаще) обновления ПО в сборке.
|
Выложите образцы файла «old_date.txt» и «infile.txt», упаковав их в архив. Откуда берётся дата в файле «old_date.txt»? По какому принципу задаётся «2014.05» в:
Код:
… else Set find=2014.05
?
|
Вложений: 1
Iska, извините, что пару дней не писал, ездил на отдых в другой город.
%infile% на самом деле WPI.hta, я его здесь переименовал только для того, чтобы показать, что в нем хранится текстовая информация.
Прикрепляю архив. В WPI.hta текст, подлежащий замене, находится на 3 и 76 строках.
|
R3m, на WSH:
читать дальше »
Код:
Option Explicit
Const ForWriting = 2
Dim strSourceFile
Dim strContent
Dim strBackupFile
If WScript.Arguments.Count = 1 Then
With WScript.CreateObject("Scripting.FileSystemObject")
strSourceFile = .GetAbsolutePathName(WScript.Arguments.Item(0))
If .FileExists(strSourceFile) Then
With .OpenTextFile(strSourceFile)
strContent = .ReadAll()
.Close
End With
With WScript.CreateObject("VBScript.RegExp")
.Global = True
.IgnoreCase = True
.Pattern = "\d{4}\.\d{2}"
If .Execute(strContent).Count = 2 Then
strContent = .Replace(strContent, CStr(Year(Now())) & "." & Right("00" & CStr(Month(Now())), 2))
Else
WScript.Echo "Found more than two matches by pattern."
WScript.Quit 3
End If
End With
strBackupFile = .BuildPath(.GetParentFolderName(strSourceFile), .GetBaseName(strSourceFile) & ".bak")
If .FileExists(strBackupFile) Then
.DeleteFile strBackupFile, True
End If
.CopyFile strSourceFile, strBackupFile, True
With .OpenTextFile(strSourceFile, ForWriting)
.Write strContent
.Close
End With
Else
WScript.Echo "Source file [" & strSourceFile & "] not found."
WScript.Quit 2
End If
End With
Else
WScript.Echo "Usage: cscript.exe //nologo " & WScript.ScriptName & " <Source file>"
WScript.Quit 1
End If
WScript.Quit 0
- Путь к исходному файлу указывается в командной строке скрипта. Можно указывать относительный путь.
- Год/месяц для поиска указывать не нужно. Поиск года/месяца производится регулярным выражением. Если будет найдено именно два (как Вы указали) совпадения — будет произведена их замена на текущие год/месяц.
- При замене создаётся резервная копия текущего исходного файла. Существующая старая резервная копия при этом удаляется.
|
Iska, что-то не могу разобраться. ваш скрипт вообще не хочет запускаться. Сохранил его в текстовый файл с расширением .wsh, запускал и с параметром и без - выдает такое окно

|
Цитата:
Цитата R3m
Сохранил его в текстовый файл с расширением .wsh, »
|
С расширением «.vbs».
Цитата:
Цитата R3m
запускал и с параметром и без »
|
В принципе, можно и просто перетащить исходный файл на скрипт с расширением «.vbs» в Проводнике — сие равнозначно указанию параметра.
|
Iska, простите, туплю слегка :) Спасибо, все работает
|
R3m, два раза — не за что ;).
|
Время: 02:41.
© OSzone.net 2001-