Cmd изменить строку в файле
Я пишу командный файл script с использованием командной строки Windows и хочу изменить каждое вхождение какого-либо текста в файл (например, "FOO" ) другим (например, "BAR" ). Каков самый простой способ сделать это? Любые встроенные функции?
ОТВЕТЫ
Ответ 1
Многие ответы здесь помогли мне указать верное направление, однако ни один из них не подошел для меня, поэтому я публикую свое решение.
У меня Windows 7, которая поставляется со встроенным PowerShell. Вот скрипт, который я использовал для поиска/замены всех экземпляров текста в файле:
Чтобы объяснить это:
- powershell запускает powershell.exe, входящий в состав Windows 7
- -Command ". " - аргумент командной строки для powershell.exe, содержащий команду для запуска
- (gc myFile.txt) читает содержимое myFile.txt ( gc - сокращение от команды Get-Content )
- -replace 'foo', 'bar' просто запускает команду замены, чтобы заменить foo на bar
- | Out-File myFile.txt | Out-File myFile.txt вывод в файл myFile.txt
- -encoding ASCII позволяет транскрибировать выходной файл в Unicode, как отмечают комментарии
Powershell.exe уже должен быть частью вашего оператора PATH, но если нет, вы можете добавить его. Его расположение на моей машине: C:\WINDOWS\system32\WindowsPowerShell\v1.0
Ответ 2
Ответ 3
Просто используется FART ( " F ind A nd R eplace T ext" утилита командной строки):
отличное небольшое бесплатное ПО для замены текста в большом наборе файлов.
проведет предварительный просмотр замещений, чтобы сделать рекурсивно в файлах этого дистрибутива Perl.
Только проблема: значок веб-сайта FART не совсем со вкусом, утончен или элегантен;)
Обновление 2017 (7 лет спустя) jagb указывает в комментариях к статье 2011 года " FARTing the Easy Way - найти и заменить текст" из Mikail Tunç
Ответ 4
Заменить - заменить подстроку с помощью замены строки Описание: Чтобы заменить подстроку другой строкой, используйте функцию подстановки строк. Показанный здесь пример заменяет все вхождения "тех" орфографических ошибок с "the" в строковой переменной str.
Ответ 5
Создать файл replace.vbs:
Чтобы использовать этот измененный script (который хорошо вызывает replace.vbs), просто введите в командной строке команду, похожую на это:
cscript replace.vbs "C:\Scripts\Text.txt" "Jim " "James "
Ответ 6
Он использует комбинацию FOR , FIND и CALL SET .
Линии, содержащие символы среди "&<>]|^ , могут обрабатываться некорректно.
Ответ 7
Примечание. Обязательно просмотрите обновление в конце этого ответа для ссылки на главный JREPL.BAT, который заменяет REPL.BAT
JREPL.BAT 7.0 и выше поддерживает Unicode (UTF-16LE) через опцию /UTF , а также любой другой набор символов, включая UTF-8, через ADO .
Я написал небольшую гибридную JScript/пакетную утилиту REPL.BAT, которая очень удобна для изменения файлов ASCII (или расширенных ASCII) через командную строку или командный файл. Чистый собственный скрипт не требует установки любого стороннего исполняемого файла, и он работает с любой современной версией Windows с XP. Это также очень быстро, особенно по сравнению с чистыми пакетными решениями.
REPL.BAT просто читает stdin, выполняет поиск и замену регулярного выражения JScript и записывает результат в stdout.
Вот тривиальный пример того, как заменить foo на bar в test.txt, если REPL.BAT находится в вашей текущей папке или, еще лучше, где-то внутри вашего PATH:
Возможности регулярного выражения JScript делают его очень мощным, особенно способность заменяющего текста ссылаться на захваченные подстроки из текста поиска.
Я включил ряд опций в утилиту, которые делают ее достаточно мощной. Например, объединение опций M и X позволяет изменять бинарные файлы! Параметр M Multi-line позволяет выполнять поиск по нескольким строкам. Параметр X eXtended substitution pattern предоставляет escape-последовательности, которые позволяют включить любое двоичное значение в заменяющий текст.
Вся утилита могла быть написана как чистый JScript, но гибридный пакетный файл устраняет необходимость явно указывать CSCRIPT каждый раз, когда вы хотите использовать эту утилиту.
Вот сценарий REPL.BAT. Полная документация встроена в скрипт.
ВАЖНОЕ ОБНОВЛЕНИЕ
Я прекратил разработку REPL.BAT и заменил его на JREPL.BAT. Эта новая утилита имеет все те же функциональные возможности REPL.BAT и многое другое:
- Поддержка Unicode UTF-16LE через собственные возможности Unicode CSCRIPT и любой другой набор символов (включая UTF-8) через ADO.
- Прочтите прямо из /write непосредственно в файл: нет необходимости в каналах, перенаправлении или переместить команду.
- Включить предоставленный пользователем JScript
- Функция перевода похожа на unix tr, только она также поддерживает поиск в регулярном выражении и замену JScript
- Отменить несогласованный текст
- Строки вывода префикса с номером строки
- и более.
Как всегда, полная документация встроена в скрипт.
Теперь исходное тривиальное решение еще проще:
Ответ 8
Используйте утилиту fnr . Он получил некоторые преимущества перед fart :
- Регулярные выражения
- Дополнительный графический интерфейс. Имеет кнопку "Создать командную строку" для создания текста командной строки для помещения в командный файл.
- Многострочные шаблоны: GUI позволяет вам легко работать с многострочными шаблонами. В FART вы должны вручную избегать разрывов строк.
- Позволяет выбрать кодировку текстового файла. Также есть опция автоматического определения.
Пример использования: fnr --cl --dir "<Directory Path>" --fileMask "hibernate.*" --useRegEx --find "find_str_expression" --replace "replace_string"
Ответ 9
Я не думаю, что есть способ сделать это с помощью любых встроенных команд. Я предлагаю вам скачать что-то вроде Gnuwin32 или UnxUtils и используйте команду sed (или загрузите только sed ):
Ответ 10
Я знаю, что опаздываю на вечеринку.
и они оба работают изначально без каких-либо дополнительных инструментов или утилит.
Ответ 11
Когда вы работаете с Git в Windows, просто запустите git-bash и используйте sed . Или, используя Windows 10, запустите "Bash в Ubuntu в Windows" (из подсистемы Linux) и используйте sed .
Редактор потока, но может редактировать файлы напрямую, используя следующую команду:
- -i используется для редактирования на месте с именем файла.
- -e указывает команду для запуска.
- s используется для замены найденного выражения "foo" на "bar", а g используется для замены найденных совпадений.
Если вы хотите заменить строку в файлах с версией только в репозитории Git, вы можете использовать:
git ls-files <eventual subfolders & filters> | xargs sed -i -e 's/foo/bar/g'
который творит чудеса.
Ответ 12
Я использовал perl, и это работает чудесно.
.orig - это расширение, которое оно добавит к исходному файлу
Для нескольких файлов, соответствующих *.html
Ответ 13
или если вы хотите сохранить вывод снова в файл.
Преимущество этого в том, что вы можете транслировать вывод из любой программы. Посмотрите также на использование регулярных выражений. Не удалось решить, как сделать его в BAT файл для более легкого использования, хотя. (
Ответ 14
1) С опцией e? , которая будет оценивать специальные последовательности символов, такие как \n\r и последовательности Unicode. В этом случае будут заменены кавычки "Foo" и "Bar" :
2) Прямая замена, где Foo и Bar не указаны.
Ответ 15
Здесь решение, которое я нашел, работало на Win XP. В моем запущенном пакетном файле я включил следующее:
Файл replace.bat выглядит следующим образом. Я не нашел способ включить эту функцию в один и тот же командный файл, потому что переменная %%a всегда, кажется, дает последнее значение в цикле for.
Ответ 16
Взгляните на Есть ли какая-либо утилита sed для cmd.exe, которая запрашивала эквивалент sed под Windows, также должна применяться к этому вопросу. Краткое содержание:
- Это можно сделать в пакетном файле, но это не очень.
- Множество доступных сторонних исполняемых файлов, которые сделают это для вас, если у вас есть роскошь установки или просто копирования через exe
- Может быть сделано с VBScript или аналогичным, если вам нужно что-то, что можно запустить в окне Windows без изменений и т.д.
Ответ 17
Может быть, немного поздно, но я часто ищу похожие вещи, так как я не хочу испытывать боль при получении одобренного программного обеспечения.
Однако вы обычно используете оператор FOR в разных формах. Кто-то создал полезный командный файл, который выполняет поиск и замену. Посмотрите здесь. Важно понимать ограничения предоставленного пакетного файла. По этой причине я не копирую исходный код в этом ответе.
Ответ 18
Два пакетных файла, которые предоставляют функции search and replace , были написаны членами Qaru dbenham и aacini с использованием native built-in jscript Windows native built-in jscript .
Они оба robust и very swift with large files по сравнению с обычными пакетными сценариями, а также simpler в использовании для базовой замены текста. Они оба имеют соответствие шаблону Windows regular expression .
Этот sed-like вспомогательный пакетный файл называется repl.bat (от dbenham).
Пример использования литерала L :
Этот grep-like вспомогательный командный файл называется findrepl.bat (от aacini).
Пример с активными регулярными выражениями:
Обе они становятся мощными общесистемными утилитами, when placed in a folder that is on the path , или могут использоваться в той же папке с командным файлом, или из командной строки cmd.
Оба имеют переключатели без case-insensitive и многие другие функции.
Ответ 19
Команда командной оболочки работает как шарм
Ответ 20
Просто столкнулся с аналогичной проблемой - "Искать и заменять текст в файлах", но, за исключением того, что для обоих имен файлов и поиска /repalce мне нужно использовать регулярное выражение. Поскольку я не знаком с Powershell и хочу сохранить мои поиски для последующего использования, мне нужно что-то более "удобное для пользователя" (желательно, если у него есть GUI).
Итак, в то время как Googling:) я нашел отличный инструмент - FAR (Найти и заменить) (а не FART).
Эта небольшая программа имеет приятный графический интерфейс и поддерживает регулярное выражение для поиска в именах файлов и внутри файлов. Только disadventage заключается в том, что если вы хотите сохранить свои настройки, вы должны запустить программу в качестве администратора (по крайней мере, на Win7).
Ответ 21
Это одно дело, что пакетный скриптинг просто не работает.
Связанный с script morechilli будет работать для некоторых файлов, но, к сожалению, он захлестнет те, которые содержат такие символы, как трубы и амперсанды.
Ответ 22
Для простой замены строк в файлах я использую с тех пор свободные Xchang32.exe из Коллекция Clay Utilities for Win32.
У него есть несколько вариантов быстрой замены строк в текстовых файлах, а также байтов в двоичных файлах. Он поддерживает также подстановочные знаки в строке имени файла и может быть выполнен по этой причине также для всех файлов в каталоге, соответствующем шаблону подстановочного знака.
И ничто другое не требуется для этого небольшого 32-битного консольного приложения, чем файл Xchang32.exe, извлеченный из ZIP файла, в любую директорию, такую как каталог пакетного файла, вызывающий его для замены (s).
Эта командная строка заменяет в файле MyBinaryFile.bin каждый байт значением 3 на два байта со значениями 2 и 5.
Общей проблемой с использованием wmic является то, что выход является файлом Unicode, хотя все символы определенно находятся в диапазоне символов ASCII, т.е. имеют значение кодовой точки ниже десятичного числа 128.
Этот небольшой пакетный код с использованием Xchang32 преобразует выходной файл wmic Unicode, содержащий только символы ASCII в текстовый файл ASCII.
Но иногда вывод wmic перенаправляется непосредственно в текстовый файл ASCII, в результате чего CR CR LF (0D 0D 0A) в текстовом файле ASCII вместо 0D 0A (возврат каретки + строка-строка). Эти неправильные окончания строк также можно легко скорректировать с помощью Xchang32:
Или все *. CSV файлы в каталоге используют символ горизонтальной вкладки в качестве разделителя, и все эти вкладки в файлах CSV должны быть заменены запятой.
Примечание: ^ и , имеют особое значение в синтаксисе Xchang32 и поэтому должны быть экранированы с помощью другого ^ или , , как это сделано в командной строке выше, или переключателя /s используется для простых строк. Это описано в файле ReadMe32.txt , а также в выводе справки при запуске Xchang32.exe /? в окне командной строки.
Ответ 23
@Rachel дал отличный ответ, но вот его вариант, чтобы прочитать содержимое переменной powershell $data . Затем вы можете легко манипулировать контентом несколько раз перед записью в выходной файл. Также посмотрите, как многострочные значения задаются в пакетных файлах .bat.
Ответ 24
Использовать powershell в .bat - для Windows 7 +
кодировка utf8 является необязательной, подходит для веб-сайтов
Ответ 25
Я предпочитаю использовать sed из утилит GNU для Win32, необходимо отметить следующее
- одинарная кавычка '' не будет работать в Windows, вместо этого используйте ""
- sed -i не будет работать в Windows, для этого потребуется обмен файлами
Таким образом, рабочий код sed для поиска и замены текста в файле в Windows, как показано ниже
Ответ 26
Загрузите Cygwin (бесплатно) и используйте unix-подобные команды в командной строке Windows.
Ваш лучший выбор: sed
Ответ 27
Инструмент, который заменяет строки в файлах, находится в VBScript (требуется Windows Script Host [WSH] для запуска в старых версиях Windows)
Фильтр, вероятно, не работает с Unicode, если вы не перекомпилируете последний Delphi (или с FreePascal/Lazarus)
Ответ 28
Я столкнулся с этой проблемой несколько раз при кодировании в Visual С++. Если у вас есть это, вы можете использовать Visual Studio Find and Replace Utility. Он позволяет вам выбрать папку и заменить содержимое любого файла в этой папке любым другим желаемым текстом.
1 EXIT /b for %%a in ("A=a" "B=b" "C=c" "D=d" "E=e" "F=f" "G=g" "H=h" "I=i" "J=j" "K=k" "L=l" "M=m" "N=n" "O=o" "P=p" "Q=q" "R=r" "S=s" "T=t" "U=u" "V=v" "W=w" "X=x" "Y=y" "Z=z" "А=а" "Б=б" "В=в" "Г=г" "Д=д" "Е=е" "Ж=ж" "З=з" "И=и" "К=к" "Л=л" "М=м" "Н=н" "О=о" "П=п" "Р=р" "С=с" "Т=т" "У=у" "Ф=ф" "Х=х" "Ц=ц" "Ч=ч" "Ш=ш" "Щ=щ" "Ь=ь" "Ы=ы" "Ъ=ъ" "Э=э" "Ю=ю" "Я=я") do ( call set %
ЗАМЕНА ОДНОЙ ПОДСТРОКИ НА ДРУГУЮ В ФАЙЛЕ
В результате, в папке, где будет запущен приведенный выше текст, создастся файл sbs2.com.
Возможно, вы будете приятно удивлены его размером - 659 БАЙТ!
Те, кому вышеприведенные изыски кажутся излишними, могут скачать готовую утилиту здесь.
Использование:
sbs2.com 0 "Old String" "New String" < infile > outfile
Осуществляется замена всех вхождений Old String на New String в файле infile. Результат запишется в файл outfile.Такую задачу можно решить без использования сторонних программ, только средствами bat !
setlocal ENABLEDELAYEDEXPANSION echo off call :txtrepl end finish C:\1\24i.bat C:\1\24i.ba1 pause exit :txtrepl rem param - find, repl, from, to set FINDTXT=%1 set REPLTXT=%2 if EXIST %3 ( set FILEFROM=%3 ) else ( echo error. Not found file %3 pause exit ) set FILEOUT=%4 set COUNT=0 for /F "tokens=*" %%n in (!FILEFROM!) do ( set /A COUNT=!COUNT!+1 set LINE=%%n set TMPR=!LINE:%FINDTXT%=%REPLTXT%! if !COUNT! == 1 ( Echo !TMPR!>!FILEOUT! ) else ( Echo !TMPR!>>!FILEOUT! ) ) exit /b rem end of proc
Ниже приведен пример с использованием локальной процедуры txtreplВывод на экран, в файл текста без перевода строки
В bat/cmd командах не предусмотрена возможность вывода данных без перевода строки. Но для решения такой задачи можно использовать некую уловку.
Команда set с параметром, предусматривающим ввод данных с экрана, позволяет вывести подсказку для ввода без перевода строки. Вот этим мы и воспользуемся.
<nul set /p a=text В данном случае, слово text (а здесь может быть и переменная) будет выведено но экран без перевода строки. Значение переменной a при этом не будет изменено (если это для вас важно).
Соответственно, для вывода текста в файл без перевода строки используется конструкция:
<nul set /p a=text>b.txtИспользование этого приема в сочетании с символом backspace (код 08) позволяет сделать вывод на экран изменяемого текста и как вариант - "вращающейся палки".
Вычисление длины строковой переменной
В bat/cmd командах нет функции, позволяющей вычислять длину строковой переменной. А такая задача возникает не так уж и редко. Однако средств командного языка достаточно, для того что бы решить такую задачу, не прибегая к использованию специальных программ. Рассмотрим несколько вариантов решения данной задачи:
1 :startvarcount if not defined var exit /b set var=%var:
1% set /a %2+=1 goto startvarcount exit /b
set st=abcdefghijklmnopqrstuvwxyz . call :var_сount2 %st% count2 echo %count2%Еще один вариант вычисления длины строковой переменной:
:StringLen :: ----------------------- :: Нахождение длины строки :: ----------------------- :: %1 - текстовая строка :: ----------------------- Set $StringLen=0 Set $StringBuf=%1" GoTo :EOF :StringLenLoop Set /A $StringLen+=1 Call Set $StringChr=%%$StringBuf:
%$StringLen%%% If ""=="%$StringChr%" GOTO :EOF GoTo :StringLenLoop
Еще один способ определения длины строки, как ни странно - достаточно быстрый:
n0.tmp" For %%i In ("%TEMP%\%
n0.tmp") Do Set /A z=%%
Ну и, наконец, решение, поразившее меня своей математической лаконичностью:
:strLen string len -- returns the length of a string :: -- string [in] - variable name containing :: the string being measured for length :: -- len [out] - variable to be used :: to return the string length :: Many thanks to 'sowgtsoi', but also 'jeb' :: and 'amel27' dostips forum :: users helped making this short and efficient :$created 20081122 :$changed 20101116 :$categories StringOperation :$source http://www.dostips.com ( SETLOCAL ENABLEDELAYEDEXPANSION set "str=A!%1!"&rem keep the A up front to ensure we rem get the length and not the upper bound rem it also avoids trouble in case of empty string set "len=0" for /L %%A in (12,-1,0) do ( set /a "len|=1%<<%%A" for %%B in (!len!) do ^ if "!str:
1<<%%A" ) ) ( ENDLOCAL & REM RETURN VALUES IF "%
set "string=12345678901234 " call :strLen string len echo len=%len%Для себя я так же использую метод половинного деления для нахождения количества символов в строке. Эта процедура менее изящна, и, возможно, потребует несколько большего времени для вычислений, чем приведенная выше, но, на мой взгляд, она понятнее. (В этом месте надо было похвалить себя еще, но что-то не нашлось достойных эпитетов)
@echo off setlocal ENABLEEXTENSIONS SetLocal EnableDelayedExpansion set "string=123456789012345678901" call :strLen string len echo len=%len% pause exit :strLen string len :: - string [in] - variable name containing the string :: -- len [out] - variable to be used to return the string length SETLOCAL ENABLEDELAYEDEXPANSION set /a nn=10 & rem max length string = 2^^nn. rem If nn=10 - max length=1024 set /a mmin=0 set /a mmax=1"<<"%nn% set "str=Q!%1!" for /L %%A in (%nn%,-1,1) do ( set /a BB = ^(!mmin! + !mmax!^) ">>" 1 call set sim=%%str:
Привожу на всякий случай и эту процедуру ))!BB!,1%% if "!sim!" == "" ( set /a mmax=!BB!) else ( set /a mmin=!BB! ) ) ENDLOCAL & SET /a %
2=%mmin% EXIT /b %mmin%
Получение подстроки.
Если смещение начала подстроки и ее длина являются константами - здесь все достаточно просто и аналогичный пример рассматривался выше:
Прошу прощения, если в качестве значения переменной str я опубликовал чей-то пароль )).
SetLocal EnableDelayedExpansion set str=123qwerty456 set n1=3 set n2=6 Set d2=!str:
Если же одна или обе эти величины - переменные, то решение будет не столь простое.
Здесь встретиться возможно не совсем обычное применение команды CALL. Немного глубже об этом на странице Полезное в разделе Особенности использования команды CALL. Там же рассмотрен и этот пример.
Итак, рассмотрим возможные решения:Или как вариант предыдущего
setlocal ENABLEEXTENSIONS SetLocal EnableDelayedExpansion set str=zaq12wsx set n1=3 set n2=6 call :SUBSTRING str,%n1%,%n2% echo %SUBD% . :SUBSTRING set SUBD=!%1:Удаление ведущих и замыкающих пробелов.
:ALLTRIM :: ----------------------- :: Krasner B. :: ----------------------- :: %1 - var with txt string :: ----------------------- SetLocal EnableDelayedExpansion set /a firstnoblank=-1 set /a lastnoblank=0 set /a curpos=1 set "str=Q!%1!" :StringLenLoop set SUBD=!str:%curpos%,1! if "!SUBD!" == "" GoTo :formrez if NOT "!SUBD!" == " " ( if !firstnoblank! == -1 set firstnoblank=!curpos! set lastnoblank=!curpos! ) set /a curpos = !curpos!+1 GoTo :StringLenLoop :formrez set /a n1=!firstnoblank!-1 set /a n2=!lastnoblank!-!firstnoblank!+1 if !firstnoblank! == -1 (set "rez primer"> set "strr=" Call :ALLTRIM strr echo result ALLTRIM ^>%strr%^< . set "strrr= 22 33 " Call :ALLTRIM strrr echo result ALLTRIM ^>%strrr%^<
Для вопросов, обсуждений, замечаний, предложений и т. п. можете использовать раздел форума этого сайта (требуется регистрация).
Новый раздел о средствах командной строки в рамках этого же проекта расположен здесь
Доброго времени суток!
появилась такая вот задачка:имеем два текстовых файла:
в каждом файле примерно 110-120 строк. каждой строке 1 файла соответствует своя строка во втором файле.
есть команда, которая получает серийный номер компа, зашитого в биосе:
далее результат выполнения этой команды нужно записать в переменную.
после этого, нужно найти в первом файле соответствие серийного номера переменной и записать в другую переменную соответствие из второго файла.alex_diablo
Активный пользователь
первые же грабли, на которые наступил - не могу правильно записать вывод команды wmic в переменную. или в файл.
вот так не выходит.
---- Automatically Merged Double Post ----
вот что выводится в результате:
alex_diablo
Активный пользователь
с первой частью задачи вроде разобрался.
выглядит так:Dragokas
Very kind Developer
alex_diablo, уверены, что это надёжный способ?
На моей МП (да и на многих других) wmic bios get serialnumber выдаёт:
Да, почти так. Там у wmic ещё лишний знак переноса строки, так что нужно с find:
alex_diablo
Активный пользователь
alex_diablo, уверены, что это надёжный способ?
На моей МП (да и на многих других) wmic bios get serialnumber выдаёт:
Да, почти так. Там у wmic ещё лишний знак переноса строки, так что нужно с find:
ну вот даже с переносом вроде сработало норм.
а по поводу способа - почти все компы в компании - DELL. у них у всех прописан уникальный код.
поэтому с этим проблем как раз таки и нет, это скорее - единственный способ правильно идентифицировать его.
что же касается остальных - (не ДЕЛЛ) , то их крайне мало. ну еще можно теоретически делать по маку сетевухи, но что делать, если
сетевух несколько, а в таблице, выгруженной из базы компов, он один?ну и по второму вопросу. не поможете?
может быть тогда сделать. в одном файле все и разделить каким-нибудь разделителем. например пробелом или точкой.
типа:и тогда подставлять имя по маку исходя из работы команды ipconfig ?
но тут еще нюанс. как быть, если в системе несколько сетевых адаптеров?
Dragokas
Very kind Developer
но тут еще нюанс. как быть, если в системе несколько сетевых адаптеров?Например, брать МАК адаптера, отмеченного как "Основной", убрав виртуальные (типа VMWare / VBox), можно с фильтрацией по подсети IP (предпоследний октет)
Или взять серийный номер тома (команда vol) или жесткого диска (см. пост), с которого запущена ОС.
Можно ещё взять, но только как часть ID, инфу из SMBIOS и CPUID, но там мало чего уникального и два одинаковых процессора/BIOS будут выдавать идентичные данные (+ это не на Batch).alex_diablo
Активный пользователь
Например, брать МАК адаптера, отмеченного как "Основной", убрав виртуальные (типа VMWare / VBox), можно с фильтрацией по подсети IP (предпоследний октет)
Или взять серийный номер тома (команда vol) или жесткого диска (см. пост), с которого запущена ОС.
Можно ещё взять, но только как часть ID, инфу из SMBIOS и CPUID, но там мало чего уникального и два одинаковых процессора/BIOS будут выдавать идентичные данные (+ это не на Batch).
класс! а нельзя ли из экселевской таблицы такое сделать?Dragokas
Very kind Developer
Формат таблиц именно XLS / не CSV ?
Для XLS нужно писать на другом языке, из интерпретируемых, встроенных в ОС, например, VBScript / JScript или PowerShell.alex_diablo
Активный пользователь
Формат таблиц именно XLS / не CSV ?
Для XLS нужно писать на другом языке, из интерпретируемых, встроенных в ОС, например, VBScript / JScript или PowerShell.alex_diablo
Активный пользователь
воспользовался вашим способом определения мака:
вроде все хорошо. только вот в системе используется разделитель тире, а у меня в таблице октеты маков все разделены двоеточиями.
подскажите, как решить проблему поиска соответствия мака, чтобы не переделывать всю таблицу и не заменять все двоеточия на тире.и таки еще не понятно. как фильтровать. чтобы в результат выдавался только один мак - физического адреса.
Dragokas
Very kind Developer
Брать данные из ipconfig /all
Фильтровать | find и т.д. или findstr, потом бить на токены через For и tokens, delims
только вот в системе используется разделитель тире, а у меня в таблице октеты маков все разделены двоеточиями.alex_diablo
Активный пользователь
Брать данные из ipconfig /all
Фильтровать | find и т.д. или findstr, потом бить на токены через For и tokens, delimsЗаменить на нужное в самой переменной.
Замена - на :подумал подумал и пришел к такому выводу. что во избежании путаницы лучше наверное сделать один файл. с каким-нибудь разделителем. в итоге содержимое файла должно выглядеть следующим образом:
т.е. 4 значения в каждой строке, разделенные точкой-запятой (серийный номер;имя компа;мак-адрес;модель компа)
что нужно в итоге от скрипта:
командой wmic bios get serialnumber получить значение в первой части строки и записать ее в одну переменную,
и в соответствии этому значению, задать остальные три переменные.Dragokas
Very kind Developer
alex_diablo
Активный пользователь
HJ3DZ72/MSK-BPETROV/90-2b-34-33-e9-4b/dell_7010
HJ37H92/MSK-AIVANOV/64-00-6a-32-9b-eb/dell_7020
4M6TV22/MSK-VSIDOROV/64-00-6a-67-ed-18/dell_5040
1WQ3F5J/MSK-AKOPYLOV/66-02-64-67-f0-2b/dell_E7010
5SQ3F5J/MSK-TANISIN/34-e6-d7-56-09-24/dell_7010
B9L9CC2/MSK-KFROLOVA/64-00-6a-67-f0-2b/dell_E7240в общем, начало кода такое:
что должен делать скрипт:
1. определить серийный номер из биоса
2. найти его соответствие в таблице и записать в переменную
3. в соответствии с серийником и таблицей, нужно в отдельные переменные записать также: имя-компа, мак-адрес и модельС первым пунктом все понятно, работает.
Далее, я пытаюсь в соответствии с определенным серийником, определить в переменную значение из сооветствующей строчки:помогите пожалуйста написать код, чтобы по найденному серийнику создать еще 3 переменные, соответсвующие имя-компа/мак-адрес/модель
alex_diablo
Активный пользователь
Dragokas
Very kind Developer
Зачем лепите своё. Я уже выше давал код, как искать. Он работает.
Вам всего лишь нужно собрать полную строку, т.е. вместо if "%serialnumber%"== подставить переменную, в которой будет заранее записана полностью ваша строка:Серийный номер вы уже знаете, как получать.
Имя ПК, производитель, модель:
MAC я не знаю, как вам получить, потому что не знаю, какие у вас критерии для фильтрации нужного.
Я предлагал выше по подсети, первым 3-м октетам. Но я не в курсе допустимо ли это для вашей сети, будет ли она менятся, и какие конкретно там у вас цифры.Соедините всё вместе и подставьте в код поиска.
alex_diablo
Активный пользователь
Зачем лепите своё. Я уже выше давал код, как искать. Он работает.
Вам всего лишь нужно собрать полную строку, т.е. вместо if "%serialnumber%"== подставить переменную, в которой будет заранее записана полностью ваша строка:Серийный номер вы уже знаете, как получать.
Имя ПК, производитель, модель:
MAC я не знаю, как вам получить, потому что не знаю, какие у вас критерии для фильтрации нужного.
Я предлагал выше по подсети, первым 3-м октетам. Но я не в курсе допустимо ли это для вашей сети, будет ли она менятся, и какие конкретно там у вас цифры.Соедините всё вместе и подставьте в код поиска.
мак получать не нужно, он известен и заранее записан в таблицу. его просто нужно записать в переменную
---- Automatically Merged Double Post ----
не нужно брать имя компа и модель из системы. их нужно подставлять из файла.
т.е. скрипт должен получить только серийник. он его и получает.
далее, в файле, который я указал выше, нужно найти этот серийник и подставить в переменные соответствующие данные из таблицы:имя компа, модель, мак-адрес
т.е. к примеру, скрипт определил, что серийный номер - 5SQ3F5J
значит в соответствии с таблицей, должны быть определены переменные типа:
name = MSK-TANISIN
mac = 34-e6-d7-56-09-24
model = dell_7010---- Automatically Merged Double Post ----
т.е. строку 5SQ3F5J/MSK-TANISIN/34-e6-d7-56-09-24/dell_7010 нужно разобрать на соответствующие переменные. надеюсь, правильно объяснил суть.
Я пишу сценарий пакетного файла с помощью среды командной строки Windows и хочу изменить каждое вхождение некоторого текста в файле (например. "FOO") с другим (ex. "БАР.)" Как это сделать проще всего? Любые встроенные функции?
многие ответы здесь помогли указать мне в правильном направлении, однако ни один из них не подходил для меня, поэтому я публикую свое решение.
у меня есть Windows 7, который поставляется со встроенным PowerShell. Вот скрипт, который я использовал для поиска / замены всех экземпляров текста в файле:
- powershell запускает powershell.exe, который включен в Windows 7
- -Command ". " является arg командной строки для в PowerShell.exe, содержащий команду для запуска
- (gc myFile.txt) читает содержание myFile.txt ( gc сокращенно от Get-Content команда)
- -replace 'foo', 'bar' просто запускает команду replace для замены foo С bar
- | Out-File myFile.txt передает выходные данные в файл myFile.txt
в PowerShell.exe должен быть частью вашего оператора PATH уже, но если нет, вы можете добавить его. Расположение его на моей машине C:\WINDOWS\system32\WindowsPowerShell\v1.0
просто использовать пердеть ("F ind A nd R eplace T ext" утилита командной строки):
отличная бесплатная программа для замены текста в большом наборе файлов.будет просматривать замены рекурсивно в файлах этого Perl распределение.
единственная проблема: значок веб-сайта пердеть не совсем со вкусом, изысканный или элегантный;)
Replace-заменить подстроку с помощью подстановки строк Описание: для замены подстроки другой строкой используйте функцию подстановки строк. Приведенный здесь пример заменяет все вхождения "teh" орфографические ошибки на "the" в строковой переменной str.
создать файл заменить.vbs:
использовать этот пересмотренный скрипт (который мы будем называть replace.ВБС) просто введите следующую команду из командной строки:
cscript replace.vbs "C:\Scripts\Text.txt" "Jim " "James "
Он использует комбинацию FOR , FIND и CALL SET .
строки, содержащие символы среди "&<>]|^ может рассматриваться неправильно.
Примечание - обязательно см. обновление в конце этого ответа для ссылки на улучшенный JREPL.Летучая мышь, которая заменяет REPL.Летучая мышь!--11-->
JREPL.BAT 7.0 и выше изначально поддерживает unicode (UTF-16LE) через /UTF опция, а также любой другой набор символов, включая UTF-8, через ADO.REPL.BAT просто читает stdin, выполняет поиск и замену регулярных выражений JScript и записывает результат в stdout.
вот тривиальный пример того, как замените foo на bar в тесте.txt, предполагая REPL.BAT находится в вашей текущей папке, или еще лучше, где-то в пределах вашего пути:
возможности JScript regex делают его очень мощным, особенно способность текста замены ссылаться на захваченные подстроки из текста поиска.
я включил ряд опций в утилиту, которые делают ее довольно мощной. Например, объединение M и X опции позволяют изменять двоичные файлы! The M многострочная опция позволяет выполнять поиск по нескольким строкам. The X опция расширенного шаблона подстановки предоставляет escape-последовательности, которые позволяют включить любое двоичное значение в текст замены.
вся утилита могла быть написана как чистый JScript, но гибридный пакетный файл устраняет необходимость явно указывать CSCRIPT каждый раз, когда вы хотите использовать утилиту.
вот REPL.Bat скрипт. Полная документация встроена в скрипт.
ВАЖНОЕ ОБНОВЛЕНИЕ
я прекратил развитие REPL.Бат, и заменил его на JREPL.ЛЕТУЧАЯ МЫШЬ. Эта новая утилита имеет все ту же функциональность REPL.Летучая мышь, плюс многое другое:
- поддержка Unicode UTF-16LE через собственные возможности cscript unicode и любой другой набор символов (включая UTF-8) через ADO.
- чтение непосредственно из / запись непосредственно в файл: нет необходимости трубы, перенаправление или команда перемещения.
- включить пользовательский JScript
- средство перевода подобно unix tr, только оно также поддерживает поиск regex и JScript replace
- отбросить несоответствующий текст
- префикс выходных строк с номером строки
- и многое другое.
как всегда, полная документация встроена в сценарий.
первоначальное тривиальное решение теперь даже проще:
Читайте также: