Войти

Показать полную графическую версию : [решено] Скрипт не захватывает восклицательный знак из текста


R3m
13-07-2014, 19:38
Имеется скрипт, который ищет строку из %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
После применения скрипта все восклицательные знаки исчезают в небытие.
Некоторые части скрипта находил гуглением.
Помогите, пожалуйста.

Iska
13-07-2014, 20:09
R3m, это связано с тем, что символ «!» при включённом отложенном раскрытии переменных окружения («setlocal … enabledelayedexpansion») имеет специальное значение.

Опишите детально, что делает/должен делать пакетный файл.

P.S. «/NODE:localhost» лишнее. «path win32_operatingsystem» можно просто заменить псевдонимом «OS».

R3m
13-07-2014, 20:42
Iska, скрипт ищет дату (YYYY.MM), заданную в файле %FindFile%, в файле %infile% и заменяет ее на текущую.
%infile% - основной скрипт WPI.hta. смена даты необходима из-за ежемесячного (а то и чаще) обновления ПО в сборке.

Iska
13-07-2014, 21:16
Выложите образцы файла «old_date.txt» и «infile.txt», упаковав их в архив. Откуда берётся дата в файле «old_date.txt»? По какому принципу задаётся «2014.05» в:
… else Set find=2014.05
?

R3m
17-07-2014, 11:04
Iska, извините, что пару дней не писал, ездил на отдых в другой город.
%infile% на самом деле WPI.hta, я его здесь переименовал только для того, чтобы показать, что в нем хранится текстовая информация.
Прикрепляю архив. В WPI.hta текст, подлежащий замене, находится на 3 и 76 строках.

Iska
18-07-2014, 06:30
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


Путь к исходному файлу указывается в командной строке скрипта. Можно указывать относительный путь.
Год/месяц для поиска указывать не нужно. Поиск года/месяца производится регулярным выражением. Если будет найдено именно два (как Вы указали) совпадения — будет произведена их замена на текущие год/месяц.
При замене создаётся резервная копия текущего исходного файла. Существующая старая резервная копия при этом удаляется.

R3m
01-08-2014, 21:58
Iska, что-то не могу разобраться. ваш скрипт вообще не хочет запускаться. Сохранил его в текстовый файл с расширением .wsh, запускал и с параметром и без - выдает такое окно
http://s019.radikal.ru/i631/1408/a3/e0bc093f7247.jpg

Iska
01-08-2014, 22:23
Сохранил его в текстовый файл с расширением .wsh, »
С расширением «.vbs».

запускал и с параметром и без »
В принципе, можно и просто перетащить исходный файл на скрипт с расширением «.vbs» в Проводнике — сие равнозначно указанию параметра.

R3m
02-08-2014, 17:35
Iska, простите, туплю слегка :) Спасибо, все работает

Iska
02-08-2014, 22:36
R3m, два раза — не за что ;).




© OSzone.net 2001-2012