Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

Нужда от съдействие за batch скрипт

Featured Replies

Зравейте, имам нужда от съдействие за скрипт, който да намери стринг в hosts и да го закоментира. Т.е. намира
127.0.0.1 www.blah
и го променя на
#127.0.0.1 www.blah
Нядявам се на разумен спам.
Моля, не ми предлагайте линкове от мрежата, освен ако не решават точно конкретния проблем. 
Благодаря
 

Разрешен от exwol

Ако правилно съм разбрал, е нещо такова:

@echo off
setlocal EnableDelayedExpansion

rem %1 is full file name
rem %2 is search string

set "n="
for /F "delims=:" %%n in ('findstr /N "%~2" %1') do set /A "n=%%n-1"
if not defined n goto :EOF

< %1 (

rem Copy N-1 lines
for /L %%i in (1,1,%n%) do set /P "line=" & echo !line!

rem Modify target line
set /P "line=" & echo #!line!

rem Copy the rest
findstr "^" 2>NUL

) > output.txt

move /Y output.txt %1

 

windows - Batch file: Find string in file and write char to beginning of line - Stack Overflow

  • Автор

Благодаря, но нещо не се разбрахме със скрипта
 

attrib -r C:\Windows\System32\drivers\etc\hosts
@echo off
setlocal EnableDelayedExpansion

rem %1 is full file name
rem %2 is search string

set "n="
for /F "delims=:" %%n in ('findstr /N "127.0.0.1 site.com" C:\Windows\System32\drivers\etc\hosts') do set /A "n=%%n-1"
if not defined n goto :end

< C:\Windows\System32\drivers\etc\hosts (

rem Copy N-1 lines
for /L %%i in (1,1,%n%) do set /P "line=" & echo !line!

rem Modify target line
set /P "#127.0.0.1 site.com" & echo #!line!

rem Copy the rest
findstr "^" 2>NUL

) > hosts.txt

:end
move /Y output.csv %1
attrib +r C:\Windows\System32\drivers\etc\hosts
pause

image.png.1f9d78e13f7d485b9463c227341ffffb.png

  • Решение

Преди време когато чоплех по-активно в Windows си бях изровил и правил нещо подобно, но не съм го тествал скоро. Скрипта извиква PowerShell. Разбира се, за да има ефект скрипта и да запише промените по hosts файла, трябва да се изпълни с Run as administrator.

смляно:

@echo off
powershell -Command "(Get-Content C:\Windows\System32\drivers\etc\hosts) -replace '127.0.0.1 www.blah', '# 127.0.0.1 www.blah' | Out-File -encoding ASCII C:\Windows\System32\drivers\etc\hosts"

 

Задължително ли трябва да е batch скрипт? Написано на C# е нещо изключително тривиално.
Скриптовите езици не са идеалното решение за манипулация на съдържанието на файлове, особено командните скриптове.
Ще се въздържа от писането на такъв тук, тъй като като цяло изключително тегаво се пишат такива за четене от файл и манипулацията му.
PowerShell е по-добър вариант. Но за съжаление не е наличен за по-старите версии на Windows.
Но VBS скриптове могат да бъдат изпълнявани на всяка версия на Windows и с VBS скрипт нещата
придобиват тривиален характер, за разлика от командните скриптове.
Ето тривиален пример с VBS, като няма значение какво ще му поставиш.
В C# може да се реализира еквивалентно. Зарежда се файлът в паметта, обработва се и след това се записва.
За да може да се извършват действия по конкретния файл е задължително да бъде изпълнен като администратор. 

Set objFSO = CreateObject(“Scripting.FileSystemObject”)
Set objFile = objFSO.OpenTextFile(“C:\Scripts\Text.txt”, ForReading)
strText = objFile.ReadAll
objFile.Close
strNewText = Replace(strText, “Jim “, “James “)
Set objFile = objFSO.OpenTextFile(“C:\Scripts\Text.txt”, ForWriting)
objFile.WriteLine strNewText
objFile.Close

 

  • Автор

Не ме бърка и vbs да е. Но ми трябва следната поредица от операции:
1. Промяна на атрибута 'само за четене' на c:\windows\system32\drivers\etc\hosts на забранен
2. Записване на символа # в началото на реда, съдържащ съответния низ
3. Запаазване на файла
4. Вдигане на флага 'само за четене'
И така или иначе работата с hosts файла изисква повишени права.

Май го измислих, горното беше бъгаво, това работи. Предполагам ще се ориентираш къде да си заместиш файловете и стринговете :) За атрибутите също си промени/добави което ти е нужно.

@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion

Set "fileIn=hosts.txt"
Set "strGet=127.0.0.2 localhost"
Set "strAdd=#"
Set "fileOut=newFile.txt"
attrib -r %fileOut%

(
    For /F Delims^=^ EOL^= %%G In (
        '""%__AppDir__%find.exe" /V /N "" 0< "%fileIn%" 2> NUL"'
    ) Do (
        Set "strLine=%%G"
        SetLocal EnableDelayedExpansion
        If /I Not "!strLine:%strGet%=!" == "!strLine!" (
            Echo=%strAdd%!strLine:*]=!
        ) Else Echo=!strLine:*]=!
        EndLocal
    )
) 1> "%fileOut%"

 

  • Автор
преди 14 минути, Raze написа:

Май го измислих

Дай линк към източника
image.png.c717f419c9cced23cf4c043d23f306b0.png
 

attrib -r C:\Windows\System32\drivers\etc\hosts
@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion

Set "fileIn=C:\Windows\System32\drivers\etc\hosts"
Set "strGet=127.0.0.1 site.com"
Set "strAdd=#"
Set "fileOut=C:\Windows\System32\drivers\etc\hosts\hosts.txt"
attrib -r %fileOut%

(
    For /F Delims^=^ EOL^= %%G In (
        '""%__AppDir__%find.exe" /V /N "" 0< "%fileIn%" 2> NUL"'
    ) Do (
        Set "strLine=%%G"
        SetLocal EnableDelayedExpansion
        If /I Not "!strLine:%strGet%=!" == "!strLine!" (
            Echo=%strAdd%!strLine:*]=!
        ) Else Echo=!strLine:*]=!
        EndLocal
    )
) 1> "%fileOut%"
copy /Y C:\Windows\System32\drivers\etc\hosts\hosts.txt hosts
attrib +r C:\Windows\System32\drivers\etc\hosts
pause

 

От тук: Search text file and append it when specific string is found using batch file - Stack Overflow

Смених само да записва стринга в началото на линията, решението беше за края.

Тествах го и директно с файла localhost, също работи. Само трябва да се стартира като администратор с десния бутон на мишката, през администраторска конзола ми дава access denied, като иска да пипа по файловете. Сложих и една пауза накрая, за да се види какво изписва, ако има грешка случайно. Ето крайната версия:

@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion

Set "fileIn=C:\Windows\System32\drivers\etc\hosts"
Set "strGet=127.0.0.1 localhost"
Set "strAdd=#"
Set "fileOut=C:\Windows\System32\drivers\etc\hosts2"
attrib -r %fileIn%

(
    For /F Delims^=^ EOL^= %%G In (
        '""%__AppDir__%find.exe" /V /N "" 0< "%fileIn%" 2> NUL"'
    ) Do (
        Set "strLine=%%G"
        SetLocal EnableDelayedExpansion
        If /I Not "!strLine:%strGet%=!" == "!strLine!" (
            Echo=%strAdd%!strLine:*]=!
        ) Else Echo=!strLine:*]=!
        EndLocal
    )
) 1> "%fileOut%"

move /Y %fileOut% %fileIn%
attrib +r %fileIn%
pause

 

Ако искаш да го направиш пак readonly, добави преди pause:

attrib +r %fileIn%

 

От най-горния ред, дето си го добавил, няма нужда, това го викам тук:

attrib -r %fileIn%
  • Автор

Ти четеш ли ме?
Скриптът е стартиран с админски права. При опит за промяна на атрибутите на файла, не го намира...

Странно, при мен работи с тези стрингове, които си дал на картинката - същия е зададен и в горния код:

XeI9VV9.png

8mlHOzu.png

1gHhfvP.png

Тествах и на windows 11, също работи. Провери стринга дали ти е същия, най-сигурно направи copy/paste в полето на скрипта, където сетваш strGet.

@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion

Set "fileIn=C:\Windows\System32\drivers\etc\hosts"
Set "strGet=127.0.0.1 localhost"
Set "strAdd=#"
Set "fileOut=C:\Windows\System32\drivers\etc\hosts2"
attrib -r %fileIn%

(
    For /F Delims^=^ EOL^= %%G In (
        '""%__AppDir__%find.exe" /V /N "" 0< "%fileIn%" 2> NUL"'
    ) Do (
        Set "strLine=%%G"
        SetLocal EnableDelayedExpansion
        If /I Not "!strLine:%strGet%=!" == "!strLine!" (
            Echo=%strAdd%!strLine:*]=!
        ) Else Echo=!strLine:*]=!
        EndLocal
    )
) 1> "%fileOut%"

move /Y %fileOut% %fileIn%
attrib +r %fileIn%
pause

 

преди 1 час, цър-вул написа:

Ти четеш ли ме?
Скриптът е стартиран с админски права. При опит за промяна на атрибутите на файла, не го намира...

Заповядай. Смени си пътищата и каквото искаш да заместваш.

Set ShellR = WScript.CreateObject("WScript.Shell")
ShellR.Run ("attrib -r ""C:\host\hosts1""")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:\host\hosts1", 1)
strText = objFile.ReadAll
objFile.Close
strNewText = Replace(strText, "127.0.0.1 localhost", "#127.0.0.1 localhost")
Set objFile = objFSO.OpenTextFile("C:\host\hosts1", 2)
objFile.WriteLine strNewText
objFile.Close
ShellR.Run ("attrib +r ""C:\host\hosts1""")

Няма нужда от излишно усложнени batch скриптове. Прекалено сложна е манипулацията там.

преди 1 час, цър-вул написа:

Не върна грешка, но и и нищо не свърши:
 

Пфф, забравих да елевейтна скрипта до Админ. Без Администраторски права очевидно, че няма да работи. Имай предвид, че антивирусните не обичат да се барат тези файлове и е възможно да дадат съобщение за необичайна и/или зловредна дейност и да блокират изпълнението му. Това независимо от вида скрипт. 
Промяната се наложи, понеже по подразбиране за vbs скриптовете няма опция в контекстното мено "Run as Administrator"

If WScript.Arguments.length = 0 Then
   Set objShell = CreateObject("Shell.Application")
   objShell.ShellExecute "cscript.exe", Chr(34) & WScript.ScriptFullName & Chr(34) & " uac", "", "runas", 3
      WScript.Quit
End If  
Set ShellR = WScript.CreateObject("WScript.Shell")
ShellR.Run ("attrib -r ""C:\Windows\System32\drivers\etc\hosts""")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:\Windows\System32\drivers\etc\hosts", 1)
strText = objFile.ReadAll
objFile.Close
strNewText = Replace(strText, "127.0.0.1 localhost", "#127.0.0.1 localhost")
Set objFile = objFSO.OpenTextFile("C:\Windows\System32\drivers\etc\hosts", 2)
objFile.WriteLine strNewText
objFile.Close
ShellR.Run ("attrib +r ""C:\Windows\System32\drivers\etc\hosts""")

  

преди 1 час, Raze написа:

Странно, при мен работи с тези стрингове, които си дал на картинката - същия е зададен и в горния код:
Тествах и на windows 11, също работи. Провери стринга дали ти е същия, най-сигурно направи copy/paste в полето на скрипта, където сетваш strGet.

Браво за усилията, но това е чист мазохизъм. Писал съм и подобни скриптове, но когато са с подобна сложност (т.е оператори, променливи и т.н) е много лесно да се допусне грешка(най-вече синтактична или типографска), понеже въобще не е лесно да бъдат проследени визуално.
VBS скриптчето има и предимството, че не е необходимо да се пишат фермани, ако трябва да заместиш повече редове, а само един тъп copy/paste на реда 

strNewText = Replace(strText, "127.0.0.1 localhost", "#127.0.0.1 localhost")

със съответните промени.
А може и да се append-ва лесно върху файла.

  • Автор

Скриптът се изпълни без да върне грешка, но hosts файлът остана непроменен.
 

Spoiler


If WScript.Arguments.length = 0 Then
   Set objShell = CreateObject("Shell.Application")
   objShell.ShellExecute "cscript.exe", Chr(34) & WScript.ScriptFullName & Chr(34) & " uac", "", "runas", 3
      WScript.Quit
End If  
Set ShellR = WScript.CreateObject("WScript.Shell")
ShellR.Run ("attrib -r ""C:\Windows\System32\drivers\etc\hosts""")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:\Windows\System32\drivers\etc\hosts", 1)
strText = objFile.ReadAll
objFile.Close
strNewText = Replace(strText, "127.0.0.1 easeus.com www.easeus.com activation.easeus.com easeus.com.cn www.easeus.com.cn track.easeus.com track.easeus.com.cn api.easeus.com update.easeus.com map2.hwcdn.net", "#127.0.0.1 easeus.com www.easeus.com activation.easeus.com easeus.com.cn www.easeus.com.cn track.easeus.com track.easeus.com.cn api.easeus.com update.easeus.com map2.hwcdn.net")
Set objFile = objFSO.OpenTextFile("C:\Windows\System32\drivers\etc\hosts", 2)
objFile.WriteLine strNewText
objFile.Close
ShellR.Run ("attrib +r ""C:\Windows\System32\drivers\etc\hosts""")

 

преди 22 минути, цър-вул написа:

Скриптът се изпълни без да върне грешка, но host файлът остана непроменен.

Отвори наново файла в Notepad++
На Windows10 x64 в 2 директории и реалната директория на hosts съм го тествал. Ако не е върнал грешка относно права и достъп очевидно е махнал readonly, следователно трябва да е прочел файла. Понеже накрая презаписва съществуващия, не виждам как няма да го е променил.

преди 22 минути, цър-вул написа:

Скриптът се изпълни без да върне грешка, но hosts файлът остана непроменен.

 Тествах го върху файл с посоченото съдържание. Извършва заместване.
 

преди 2 часа, цър-вул написа:

Не мога да си го обясня това, но е факт. Не променя съдържанието.
Сори за изгубеното ти време.

Сигурен ли си, че нещо не възпрепятства промяната? Антивирусни програми, дори Windows Defender и т.н са възможни причини.
Може ли да видим образец на файла? Можеш ли да видиш в Properties или в команден ред дата и час на последна промяна? И дали поне премахва ReadOnly атрибута?
Следва да се търси къде точно е проблема. На каква версия на Windows се изпълнява?
Да не се окаже, че причината да не работи нищо не е в самите скриптове и няма нищо общо с тях самите?

преди 2 минути, exwol написа:

@цър-вул, в крайна сметка и в името на теста опита ли това, което аз пльоснах по-горе?

И то е вариант. Проблемът се състои във факта, че иска powershell, но не следва да преставлява проблем за съвременна версия на Windows.

  • Автор
преди 5 часа, jtaggerx написа:

Сигурен ли си, че нещо не възпрепятства промяната? Антивирусни програми, дори Windows Defender и т.н са възможни причини.

Тестовете са при спрян Defender

преди 5 часа, jtaggerx написа:

дата и час на последна промяна?

5.11 18:43

преди 5 часа, jtaggerx написа:

На каква версия на Windows се изпълнява?

Win 11 25236

преди 5 часа, exwol написа:

@цър-вул, в крайна сметка и в името на теста опита ли това, което аз пльоснах по-горе?

Да, и върна грешка:
код:

Spoiler

@echo off
powershell -Command "(Get-Content C:\Windows\System32\drivers\etc\hosts) -replace '127.0.0.1 easeus.com www.easeus.com activation.easeus.com easeus.com.cn www.easeus.com.cn    track.easeus.com track.easeus.com.cn api.easeus.com update.easeus.com map2.hwcdn.net'
', '# 127.0.0.1 easeus.com www.easeus.com activation.easeus.com easeus.com.cn www.easeus.com.cn track.easeus.com track.easeus.com.cn api.easeus.com update.easeus.com map2.hwcdn.net'| Out-File -encoding ASCII C:\Windows\System32\drivers\etc\hosts"
pause

Резултат - завъртя в конзолата целия hosts файл и върнна грешка, която след дълго зверене не успях да установя:

''' is not recognized as an internal or external command,
operable program or batch file.

 

преди 5 часа, jtaggerx написа:

образец на файла

 

hosts

преди 1 час, цър-вул написа:

Да, и върна грешка:
код:

  Затвори скритото съдържание

@echo off
powershell -Command "(Get-Content C:\Windows\System32\drivers\etc\hosts) -replace '127.0.0.1 easeus.com www.easeus.com activation.easeus.com easeus.com.cn www.easeus.com.cn    track.easeus.com track.easeus.com.cn api.easeus.com update.easeus.com map2.hwcdn.net'
', '# 127.0.0.1 easeus.com www.easeus.com activation.easeus.com easeus.com.cn www.easeus.com.cn track.easeus.com track.easeus.com.cn api.easeus.com update.easeus.com map2.hwcdn.net'| Out-File -encoding ASCII C:\Windows\System32\drivers\etc\hosts"
pause

 

Ако това е 1 към 1 скрипта, който си пуснал, е разбираемо да извърти hosts файла и нищо да не се случи с грешка.

1-во. Имаш нов ред в командата, а тя трябва да е на един ред. Не пиши скриптове в Notepad, ако там ги пишеш.

2-ро. Съществено е, че имаш една единична кавичка повече, точно там, където започва новият ред в горния пример даден от теб. По-конкретно сложил си една излишна единична кавичката преди запетаята, която разделя търсения низ с този, който трябва да го замени.

Скрипта работи без проблеми, току що го тествах на моя машина.

Най-конкретно - сваляш прикачения .zip, разархивираш и стартираш като administrator. 

change_string_in_file_with_powershell.zip

  • Автор

Благодаря! В Notepad3 редактирам и както казах изгледах си очите, ама не го видях. Нали знаеш 4 гледат по-добре от 2. :) 
Едит:вече не знам - за сега вдигам ръце:

image.png.d10eb187be092c01439ef23ce2167007.png

преди 1 час, цър-вул написа:

Благодаря! В Notepad3 редактирам и както казах изгледах си очите, ама не го видях. Нали знаеш 4 гледат по-добре от 2. :) 

Случва се. :) И аз съм си разковавал тарабите 2 дни поред, докато не разбрах, че за конкретни пирони си има подходяща теслЪ.

 

преди 8 часа, jtaggerx написа:

... но не следва да преставлява проблем за съвременна версия на Windows.

Да, именно. Все пак не е релевантно нито очаквано да се седи на стари технологии - в случая ОС. Разбираемо е някои новости да предлагат повече екстри в това число и улеснения, които се вписват в съвременните нужди.

 

edit:

преди 1 час, цър-вул написа:

Едит:вече не знам - за сега вдигам ръце:

Много бързо вдигаш белия флаг. Виж си правата за hosts файла, че ако си го бомбардирал с някакви други скриптове е много вероятно да са му размертикосани. С десен бутон на файла > Properties > Security

За SYSTEM и Administrators трябва да сa еднакви. 

 

hosts-sec.png

Добавете отговор

Можете да публикувате отговор сега и да се регистрирате по-късно. Ако имате регистрация, влезте в профила си за да публикувате от него.

Гост
Публикацията ви съдържа термини, които не допускаме! Моля, редактирайте съдържанието си и премахнете подчертаните думи по-долу. Ако замените букви от думата със звездички или друго, за да заобиколите това предупреждение, профилът ви ще бъде блокиран и наказан!
Напишете отговор в тази тема...

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    25%
    Дарени 252.69 EUR от нужните 1,000.00 EUR

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.