Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Скрипт не захватывает восклицательный знак из текста

Ответить
Настройки темы
CMD/BAT - [решено] Скрипт не захватывает восклицательный знак из текста
R3m R3m вне форума

Новый участник


Сообщения: 8
Благодарности: 0


Конфигурация

Профиль | Сайт | Отправить PM | Цитировать


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

Отправлено: 19:38, 13-07-2014

 

Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


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

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

P.S. «/NODE:localhost» лишнее. «path win32_operatingsystem» можно просто заменить псевдонимом «OS».
Это сообщение посчитали полезным следующие участники:

Отправлено: 20:09, 13-07-2014 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.

R3m R3m вне форума Автор темы

Новый участник


Сообщения: 8
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


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

Отправлено: 20:42, 13-07-2014 | #3


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


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

Отправлено: 21:16, 13-07-2014 | #4

R3m R3m вне форума Автор темы

Новый участник


Сообщения: 8
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


Вложения
Тип файла: rar 1.rar
(4.7 Kb, 23 просмотров)

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

Отправлено: 11:04, 17-07-2014 | #5


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


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
  • Путь к исходному файлу указывается в командной строке скрипта. Можно указывать относительный путь.
  • Год/месяц для поиска указывать не нужно. Поиск года/месяца производится регулярным выражением. Если будет найдено именно два (как Вы указали) совпадения — будет произведена их замена на текущие год/месяц.
  • При замене создаётся резервная копия текущего исходного файла. Существующая старая резервная копия при этом удаляется.
Это сообщение посчитали полезным следующие участники:

Отправлено: 06:30, 18-07-2014 | #6

R3m R3m вне форума Автор темы

Новый участник


Сообщения: 8
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


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

Отправлено: 21:58, 01-08-2014 | #7


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


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

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

Отправлено: 22:23, 01-08-2014 | #8

R3m R3m вне форума Автор темы

Новый участник


Сообщения: 8
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


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

Отправлено: 17:35, 02-08-2014 | #9


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


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

Отправлено: 22:36, 02-08-2014 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Скрипт не захватывает восклицательный знак из текста

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
восклицательный знак после иистоляции! geeg Непонятные проблемы с Железом 9 13-07-2017 07:32
Драйвер - [решено] Восклицательный знак при вставке флешки Ligas Microsoft Windows 7 12 23-01-2012 14:32
Ошибка - Восклицательный знак при вставке флешки Ligas Microsoft Windows 2000/XP 3 20-01-2011 15:00
CMD/BAT - [решено] Как убрать из названий файлов и папок восклицательный знак? Oleg48 Скриптовые языки администрирования Windows 3 05-08-2010 14:45
HDD - Восклицательный знак Wbares Накопители (SSD, HDD, USB Flash) 1 19-08-2009 14:19




 
Переход