thedarklord
Goto Top

Systemdatei mit Batch bearbeiten, danach wieder zu einer Systemdatei machen

Hallo face-smile

Ich lasse in einer Systemdatei in Windows XP ein Wort suchen und durch ein anderes ersetzen.
Das funktioniert auch gut, allerdings ist das Attribut nach der Bearbeitung nicht mehr HSA wie vorher sondern nur noch A.
Gibt es eine Möglichkeit, nach dem Ersetzen die Datei wieder zu einer Systemdatei zu machen?

Hier die Batch:
@echo off & setlocal
set "Datei=c:\systemdatei.ini"   
set "Von=ALTESWORT"  
set "Nach=NEUESWORT"  

set "t=%temp%\text.tmp"   
if exist "%t%" del "%t%"   
for /f "usebackq delims=" %%i in ("%Datei%") do set "Line=%%i" & call :ProcessLine  
move "%t%" "%Datei%"  
goto :eof

:ProcessLine
call set "Line=%%Line:%Von%=%Nach%%%"  

>>"%t%" echo %Line%  
goto :eof

Kann ich irgendwie mit der Batch die Attribute wieder setzen? Ich habe aber auch mittels Rechtsklick auf die Datei nichts gefunden, um sie wieder als Systemdatei zu deklarieren. Habe auch noch nicht ausprobiert, ob das System danach meckert, wenn ich die Datei mittels Batch und nicht z.B. über msconfig.exe bearbeite...
Hat jemand damit Erfahrung und weiss, dass das Attribut egal ist beim Systemstart?

Gruß Dark

Content-ID: 134262

Url: https://administrator.de/contentid/134262

Ausgedruckt am: 22.11.2024 um 01:11 Uhr

Tommy70
Tommy70 25.01.2010 um 10:35:16 Uhr
Goto Top
Hallo,

versuchs mal mit attrib
TheDarkLord
TheDarkLord 25.01.2010 um 10:46:36 Uhr
Goto Top
Hallo face-smile

Japp, vielen Dank! Das hab ich jetzt auch gerade gemacht.
Ich hatte das attrib +s +h nur an der falschen Stelle in der Batch, deshalb hat es nicht geklappt!

So funktioniert es mit der Batch und die Datei hat danach auch wieder HSA als Attribut:
@echo off & setlocal
set "Datei=c:\systemdatei.ini"   
set "Von=ALTESWORT"  
set "Nach=NEUESWORT"  

set "t=%temp%\text.tmp"   
if exist "%t%" del "%t%"   
for /f "usebackq delims=" %%i in ("%Datei%") do set "Line=%%i" & call :ProcessLine  
move "%t%" "%Datei%"  
attrib +s +h %Datei%
goto :eof

:ProcessLine
call set "Line=%%Line:%Von%=%Nach%%%"  

>>"%t%" echo %Line%  
goto :eof

Vielen Dank für die schnelle Antwort, Tommy!

Gruß Dark
Biber
Biber 25.01.2010 um 10:59:41 Uhr
Goto Top
Moin TheDarkLord,

zu der Teilfrage
Hat jemand damit Erfahrung und weiss, dass das Attribut egal ist beim Systemstart?
Ja, nein, eher umgekehrt.

Einige (meiner Wahrnehmung nach der überwiegende Teil der) Systemdateien/Systemordner MÜSSEN neben einem feststehenden Namen zusätzlich auch die Attribute System/Hidden gesetzt haben, seltener wird auf gesetztes Readonly-Attribut geprüft.

Unabhängig davon gilt aber in WGs wie auch beim Bätchen: "Verlasse den Raum so, wie du ihn vorzufinden wünscht, mindestens aber so, wie du ihn vorgefunden hast".
Wenn du also vorher weißt, dass du eine RSH-Datei (bzw. eine Datei mit sehr speziellen Attributen) anfasst, dann sollte es selbstverständlich sein, diesen Zustand zu restaurieren.....

Grüße
Biber
TheDarkLord
TheDarkLord 25.01.2010 um 11:12:47 Uhr
Goto Top
Hallo Biber,

japp das hab ich mir schon gedacht, deshalb wollte ich es garnicht erst auf einen Versuch ankommen lassen sondern gleich die Datei wieder mit den vorherigen Attributen versehen face-smile

Danke nochmal für die Erklärung!

Gruß Dark
pieh-ejdsch
pieh-ejdsch 25.01.2010 um 20:07:06 Uhr
Goto Top
Hi DarkLord,

wenn schon Systemdateien dann würde ich aber auch nichts den Zufall überlassen.

@echo on & setlocal
set "Datei=c:\hiberfil.sys"  
set "Von=ALTESWORT"  
set "Nach=NEUESWORT"  

set "t=%temp%\text.tmp"  
if exist "%t%" del "%t%"  
set "Oldset="  
for /f "delims=:" %%i in ('attrib "%Datei%"') do set "Attrib=%%~i"  
for /f "usebackq delims=" %%i in ("%Datei%") do set "Line=%%i" & call :ProcessLine  
move "%t%" "%Datei%"  
for %%i in (%Attrib:~0,1% %Attrib:~3,1% %Attrib:~4,1% %Attrib:~5,1%) do call :Oldset %%i

attrib%Oldset% "%Datei%"  
goto :eof

:ProcessLine
call set "Line=%%Line:%Von%=%Nach%%%"  

>>"%t%" echo.%Line%  
goto :eof

:Oldset
set "Oldset=%Oldset% +%1"  
goto :eof

Das i Attribut für nicht indiziert ist ja bei XP glaub ich gar net vorhanden.

Gruß Phil
Biber
Biber 25.01.2010 um 20:44:35 Uhr
Goto Top
Moin pieh-ejdsch,

als (geplant) letzte Spitzfindigkeit zu diesem Thema...
zumindest optisch eleganter und vermutlich etwas flotter als deine Zeile 09
for /f "delims=:" %%i in ('attrib "%Datei%"') do set "Attrib=%%~i"

...fände ich den Weg über die von %~ai (der Attribut-Variante) der abgeleiteten Laufvariablen:

Beispiel am CMD-Prompt:

>attrib datei.bla +h +s +r


(=20:36:13  D:\temp=)
>for %i in (datei.bla) do @echo %~ai
-rahs----

(=20:36:34  D:\temp=)
>attrib datei.bla
A  SHR     D:\temp\datei.bla

Zu beachten ist nur für die anschließende Substring-Arie, dass die Reihenfolge der Atrribute -wie von RedmonderInnen zu erwarten war-- bei der Anzeige von ATTRIB eine vollkommen andere als bei %~ai ist ...face-wink

Grüße
Biber
TheDarkLord
TheDarkLord 25.01.2010 um 21:09:45 Uhr
Goto Top
Vielen Dank für die Hile ihr zwei face-smile

Gruß Dark

Nachtrag:
Wenn wir schon mal dabei sind, das gelöste Thema zu behandeln, noch eine "Schönheitsfrage" face-wink
Wie kann ich denn sozusagen überprüfen, ob NEUESWORT schon in der Datei vorhanden ist?
Genaueres Beispiel:
altes Wort: "Param 1"
neues Wort: "Param 1, Param 2, Param 3"
Ist das einfach zu machen, dass ich überprüfen kann, ob "Param 2, Param 3" schon in der Datei steht?
Weil ich hab mir überlegt, wenn ich die Batch ein zweites mal ausführe (oder jemand anderes, der nicht so versiert ist), dann wird ja beim ersten mal "Param 1" in "Param1, Param 2, Param3" geändert. Beim zweiten mal kommt dann aber "Param 1, Param 2, Param 3, Param 2, Param 3" heraus - könnt ihr mir folgen?
Vielleicht stehe ich auf dem Schlauch, aber ich komme einfach nicht darauf, wie ich das lösen kann...

Gruß Dark
pieh-ejdsch
pieh-ejdsch 25.01.2010 um 23:53:48 Uhr
Goto Top
Hi DarkLord,

findstr löst dieses Problem zu beginn der Batch Zeile 06

@Biber ja das mit dem Attribut aus der FOR vari direkt zu holen ist mir gar net bewusst gewesen.
am besten ich mach noch mal nen CrashKurs über die Variablen damit da mehr hängenbleibt.

@echo on & setlocal
set "Datei=c:\hiberfil.sys"  
set "Von=ALTESWORT"  
set "Nach=NEUESWORT"  

findstr /c "%nach%" "%Datei%" 2>nul && goto :eof  

set "t=%temp%\text.tmp"  
if exist "%t%" del "%t%"  
set "Oldset="  
for %%i in ("%Datei%") do set "Attrib=%%~ai"  

for /f "usebackq delims=" %%i in ("%Datei%") do set "Line=%%i" & call :ProcessLine  
move "%t%" "%Datei%"  
for %%i in (%Attrib:~1,1% %Attrib:~2,1% %Attrib:~3,1% %Attrib:~4,1%) do if not "%%i"=="-" call :Oldset %%i  

attrib%Oldset% "%Datei%"  
goto :eof

:ProcessLine
call set "Line=%%Line:%Von%=%Nach%%%"  

>>"%t%" echo %Line%  
goto :eof

:Oldset
set "Oldset=%Oldset% +%1"  
goto :eof

Gruß Phil
TheDarkLord
TheDarkLord 26.01.2010 um 10:41:57 Uhr
Goto Top
Hey Phil, 100%ig, vielen Dank!

Hast nur einen kleinen Fehler in Zeile 6. findstr /c:SUCHSTRING ist die Syntax.
Das muss also heißen:
findstr /c:"%Nach%" "%Datei%" 2>nul && goto :eof

Hier nochmal das komplette Script für jemanden, der das vielleicht auch braucht.
In diesem Fall hier wird die boot.ini modifiziert, um eine "640x480 16Farben BMP", mit dem Namen "boot.bmp" in C:\Windows liegend, beim hochfahren Anstatt des WinXP Bootscreens anzuzeigen. Natürlich muss die bmp noch kopiert werden xD
@echo on & setlocal
set "DATEI=c:\boot.ini"  
set "VON=/fastdetect"  
set "NACH=/fastdetect /bootlogo /noguiboot"  

findstr /c:"%NACH%" "%DATEI%" 2>nul && goto :eof  

set "t=%temp%\text.tmp"  
if exist "%t%" del "%t%"  
set "Oldset="  
for %%i in ("%DATEI%") do set "Attrib=%%~ai"  

for /f "usebackq delims=" %%i in ("%DATEI%") do set "Line=%%i" & call :ProcessLine  
move "%t%" "%DATEI%"  
for %%i in (%Attrib:~1,1% %Attrib:~2,1% %Attrib:~3,1% %Attrib:~4,1%) do if not "%%i"=="-" call :Oldset %%i  

attrib%Oldset% "%DATEI%"  
goto :eof

:ProcessLine
call set "Line=%%Line:%VON%=%NACH%%%"  

>>"%t%" echo %Line%  
goto :eof

:Oldset
set "Oldset=%Oldset% +%1"  
goto :eof

Gruß Dark