Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Скрипт не захватывает восклицательный знак из текста (http://forum.oszone.net/showthread.php?t=285002)

R3m 13-07-2014 19:38 2376091

Скрипт не захватывает восклицательный знак из текста
 
Имеется скрипт, который ищет строку из %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 2376108

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

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

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

R3m 13-07-2014 20:42 2376116

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

Iska 13-07-2014 21:16 2376133

Выложите образцы файла «old_date.txt» и «infile.txt», упаковав их в архив. Откуда берётся дата в файле «old_date.txt»? По какому принципу задаётся «2014.05» в:
Код:

… else Set find=2014.05
?

R3m 17-07-2014 11:04 2377474

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

Iska 18-07-2014 06:30 2377826

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 2384249

Iska, что-то не могу разобраться. ваш скрипт вообще не хочет запускаться. Сохранил его в текстовый файл с расширением .wsh, запускал и с параметром и без - выдает такое окно

Iska 01-08-2014 22:23 2384264

Цитата:

Цитата R3m
Сохранил его в текстовый файл с расширением .wsh, »

С расширением «.vbs».

Цитата:

Цитата R3m
запускал и с параметром и без »

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

R3m 02-08-2014 17:35 2384489

Iska, простите, туплю слегка :) Спасибо, все работает

Iska 02-08-2014 22:36 2384549

R3m, два раза — не за что ;).


Время: 02:41.

Время: 02:41.
© OSzone.net 2001-