Skocz do zawartości
Rufik_

Potrzebuję pomocy z plikiem .bat

Rekomendowane odpowiedzi

Napisano (edytowane)

Cześć, z góry dzięki wszystkim za pomoc. Otóż napisałem taki plik .bat - jego zadaniem jest robić kopię pulpitów i dokumentów na serwerze wielu stacji roboczych. Plik uruchamiany na serwerze.

 


:start

timeout 1

set IB=
set /p IB=<"IB.txt"

@echo off
net use /delete k: /y >nul
net use k: \\%IB%\c$\users\user /user:User nokia >nul
@echo on

robocopy k:\Desktop\ d:\stacje\%IB%\Desktop /s /MAX:102400 /LOG:d:\stacje\logs\%IB%_deskt_%date%.txt /r:1 /w:1 >nul
robocopy k:\Documents\ d:\stacje\%IB%\Documents /s /MAX:102400 /LOG:d:\stacje\logs\%IB%_docs_%date%.txt /r:1 /w:1 >nul
net use /delete k: /y >nul
7z u -r -mx=7 -ms=off D:\stacje\%IB%_%date%.7z D:\stacje\%IB%
rmdir /s /q d:\stacje\%IB%

forfiles /p "d:\stacje\logs" /s /m *.* /c "cmd /c Del @path" /d -7 
forfiles /p "d:\stacje" /s /m *.* /c "cmd /c Del @path" /d -7 

timeout 1

goto start

quit

 

 

Chodzi, o to żeby w miejscu %IB% podstawiało mi adresy IP z pliku IB.txt. Plik IB.txt do testów wygląda tak:

 

192.168.0.1

192.168.0.2

192.168.0.3

 

itp.

 

Problem w tym, że komenda się wykonuje poprawnie, ale bierze pod uwagę tylko pierwszy wpisany adres IP. a chciałbym, żeby najpierw zrobiła kopia adresu IP1, potem IP2, potem IP3 i tak do końca listy. Po zakończeniu listy by okno CMD się zamknęło.

 

Bardzo proszę o pomoc, bo przegooglowałem co się dało i nie znalazłem rozwiązania, a sądzę że da się to tak ustawić. Dzięki za pomoc i pozdrawiam.

Edytowane przez Rufik_

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

a czy przypadkiem adresy nie powinny być zapisane w innej formie ? Np.: "192.168.0.1" , "192.168.0.2" , "192.168.0.3" - w jednej linii.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Napisano (edytowane)

Dla mnie zawsze łatwiej było poprostu odpalić Delphi i napisać sobie normalny programik niż męczyć się z kosmiczną składnią w skryptach. Wiem że to taki overkill dla zwykłego backupu ale już tak mam.

Edytowane przez Atak_Snajpera

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Napisano (edytowane)

a czy przypadkiem adresy nie powinny być zapisane w innej formie ? Np.: "192.168.0.1" , "192.168.0.2" , "192.168.0.3" - w jednej linii.

 

No właśnie tego nie wiem, testowałeś? Sądzę, że jest jakiś standard jak to powinno być, tylko go nie znam :)

 

Co do Delphi to nie jestem tutaj ekspertem.

 

Edit:

Jakieś pomysły? :) 

Edytowane przez Rufik_

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

nie testowałem... ale być może problem jest ze "złym" formatem pliku txt. Musisz potestować.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

nie testowałem... ale być może problem jest ze "złym" formatem pliku txt. Musisz potestować.

 

To to ja podejrzewam, tylko na chybił trafił to trochę ciężko - na chybił trafił próbowałem bez skutku :D Mi się wydaje, że pętla ma tu też jakąś rolę? Co myślicie?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

PAnie i Panowie, to jak Waszym zdaniem powinien wyglądać ten skrypt i plik .txt? :) Będę wdzięczny za poprawienie moich błędów :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Napisano (edytowane)

Plik napewno tak jak miałeś. Czyli jeden wpis na linię. Co do reszty to przestudiuj ten przykład

 

setlocal EnableDelayedExpansion
set outfile=c:\temp\tempout.txt
del %outfile%
FOR /f "tokens=*" %%f in (dlist.txt) DO (
   echo.
   echo --------------------
   set indir=%%f
   echo Basediv indir=!indir!
   echo Processing division !indir!

   echo. >> %outfile%
   echo {DIVNAME=!indir!} >> %outfile%
   pause   
)

Edytowane przez Atak_Snajpera

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Plik napewno tak jak miałeś. Czyli jeden wpis na linię. Co do reszty to przestudiuj ten przykład

 

setlocal EnableDelayedExpansion
set outfile=c:\temp\tempout.txt
del %outfile%
FOR /f "tokens=*" %%f in (dlist.txt) DO (
   echo.
   echo --------------------
   set indir=%%f
   echo Basediv indir=!indir!
   echo Processing division !indir!

   echo. >> %outfile%
   echo {DIVNAME=!indir!} >> %outfile%
   pause   
)

 

Dzięki za wskazówkę, ale szczerze nic mi ten przykład nie mówi :D Nie jestem w tym, aż tak biegły może dlatego. Może pomógłbyś mi dopieścić ten mój skrypt jakby to miało wyglądać? Byłbym niezmiernie wdziędzny i zobowiązany :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Napisano (edytowane)

Uproszczę to może załapiesz jak to działa.

Bieżąca linia z pliku IB.txt jest przechowywana w zmiennej %%f. Następnie wartość ze %%f kopiujemy do własnej zmiennej i ją wyświetlamy.

 

@echo off
setlocal EnableDelayedExpansion
FOR /f "tokens=*" %%f in (IB.txt) DO ( 

   set IB=%%f
   echo !IB!

)

 

 

 

 

Nie jestem pewien czy powinnobyć %IB% czy !IB! w ścieżkach

@echo off
setlocal EnableDelayedExpansion
FOR /f "tokens=*" %%f in (IB.txt) DO ( 

set IB=%%f

@echo off
net use /delete k: /y >nul
net use k: \\%IB%\c$\users\user /user:User nokia >nul
@echo on

robocopy k:\Desktop\ d:\stacje\%IB%\Desktop /s /MAX:102400 /LOG:d:\stacje\logs\%IB%_deskt_%date%.txt /r:1 /w:1 >nul
robocopy k:\Documents\ d:\stacje\%IB%\Documents /s /MAX:102400 /LOG:d:\stacje\logs\%IB%_docs_%date%.txt /r:1 /w:1 >nul
net use /delete k: /y >nul
7z u -r -mx=7 -ms=off D:\stacje\%IB%_%date%.7z D:\stacje\%IB%
rmdir /s /q d:\stacje\%IB%

forfiles /p "d:\stacje\logs" /s /m *.* /c "cmd /c Del @path" /d -7 
forfiles /p "d:\stacje" /s /m *.* /c "cmd /c Del @path" /d -7 

)

Edytowane przez Atak_Snajpera

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Uproszczę to może załapiesz jak to działa.

Bieżąca linia z pliku IB.txt jest przechowywana w zmiennej %%f. Następnie wartość ze %%f kopiujemy do własnej zmiennej i ją wyświetlamy.

 

@echo off
setlocal EnableDelayedExpansion
FOR /f "tokens=*" %%f in (IB.txt) DO ( 

   set IB=%%f
   echo !IB!

)

 

 

 

 

Nie jestem pewien czy powinnobyć %IB% czy !IB! w ścieżkach

@echo off
setlocal EnableDelayedExpansion
FOR /f "tokens=*" %%f in (IB.txt) DO ( 

set IB=%%f

@echo off
net use /delete k: /y >nul
net use k: \\%IB%\c$\users\user /user:User nokia >nul
@echo on

robocopy k:\Desktop\ d:\stacje\%IB%\Desktop /s /MAX:102400 /LOG:d:\stacje\logs\%IB%_deskt_%date%.txt /r:1 /w:1 >nul
robocopy k:\Documents\ d:\stacje\%IB%\Documents /s /MAX:102400 /LOG:d:\stacje\logs\%IB%_docs_%date%.txt /r:1 /w:1 >nul
net use /delete k: /y >nul
7z u -r -mx=7 -ms=off D:\stacje\%IB%_%date%.7z D:\stacje\%IB%
rmdir /s /q d:\stacje\%IB%

forfiles /p "d:\stacje\logs" /s /m *.* /c "cmd /c Del @path" /d -7 
forfiles /p "d:\stacje" /s /m *.* /c "cmd /c Del @path" /d -7 

)

 

To czyli jak powinien wyglądać kod .bat i IB.txt - bo nadal nie czaję, zwłaszcza tego:

 

 [code]@echo off
setlocal EnableDelayedExpansion
FOR /f "tokens=*" %%f in (IB.txt) DO ( 

set IB=%%f 

 

Gdzie to wstawić?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

No przecież masz gotowca... Sam go nawet przekleiłeś cytując mojego posta.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

No przecież masz gotowca... Sam go nawet przekleiłeś cytując mojego posta.

 

Sorry może jestem głupi, ale gdzie ten gotowiec jak to wkleić? :D Wpisz mi jak możesz .bat i ib.txt? :D

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

To może lepiej zainstaluj na każdej stacji jakiś darmowy soft do backupu?

Wybór jest spory, jak choćby Veeam albo Cobian

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

To może lepiej zainstaluj na każdej stacji jakiś darmowy soft do backupu?

Wybór jest spory, jak choćby Veeam albo Cobian

 

Wiesz mówimy o jakichś 350 komputerach :) Mając na uwadze inne obowiązki jest to raczej niewykonalne :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Mówiąc o 350 komputerach dziwię się, że jeszcze nie ma takiego czegoś zainstalowanego w dodatku z centralnym serwerem zarządzającym.

Ewentualnie wszystkie pliki powinny być trzymane na udziale sieciowym lub kilku i ten udział był by backupowany każdego dnia.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Napisano (edytowane)

Mówiąc o 350 komputerach dziwię się, że jeszcze nie ma takiego czegoś zainstalowanego w dodatku z centralnym serwerem zarządzającym.

Ewentualnie wszystkie pliki powinny być trzymane na udziale sieciowym lub kilku i ten udział był by backupowany każdego dnia.

 

Powinny. Masz rację, ale to jest stan zastały. Nawet domena nie działa. W domenie AD było by łatwiej. Póki co muszę się posiłkować protezą .bat. Pomożesz?

 

PS. Serwerów mamy z 25, ale każdy od czegoś innego. Na razie musi być .bat.

 

Pomożesz?

Edytowane przez Rufik_

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Ale czy Ty rozumiesz, że to co napisałeś nie działa?!

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Napisano (edytowane)

Średnio pamiętam tak antyczne rozwiązania. Prędzej coś w PowerShellu dało by się wykombinować.

 

Poniższy skrypt zapisujesz z rozszerzeniem .ps1

$complist_org = Get-Content .\IB.txt
$complist = @()
$data = get-date -f dd-MM-yyyy

#Tu wpisz haslo do konta ktore ma dostep do komputerow
$pass="supertajnehasloktorymniejestnokia"| ConvertTo-SecureString -AsPlainText -Force
$cred = New-Object System.Management.Automation.PsCredential('user',$pass)

foreach ($comp in $complist_org) {
   if(Test-Connection -Computername $comp -count 2 -Quiet) {$complist += $comp}
   else {Write-Host $comp jest offline}
}

foreach ($computer in $complist) {
   if (Get-PSDrive -Name "K") {
       Remove-PSDrive -Name "K"
   }
   $log1 = $comp + "_desk_" + $data + ".txt"
   $log1 = $comp + "_docs_" + $data + ".txt"
   $arch = $comp + "_" + $data
   New-PSDrive -Name "K" -PSProvider "FileSystem" -Credential $cred -Root "\\$computer\c$\users\user"
   robocopy K:\Desktop\ d:\stacje\$comp\Desktop /s /copyall /np /MAX:102400 /LOG:d:\stacje\logs\$log1 /r:1 /w:1 >nul
   robocopy K:\Documents\ d:\stacje\$comp\Documents /s /copyall /np /MAX:102400 /LOG:d:\stacje\logs\$log2 /r:1 /w:1 >nul
   Remove-PSDrive -Name "K"
   7z u -r -mx=7 -ms=off D:\stacje\$arch.7z D:\stacje\$comp
   Remove-Item –Path d:\stacje\$comp –Recurse -Force
}

 

Nie testowałem. Wszystko było pisane "na sucho".

Edytowane przez narmiak

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Napisano (edytowane)

Tak jak sądziłem musi być !IB! zamiast %IB%.

 

@echo off
setlocal EnableDelayedExpansion
FOR /f "tokens=*" %%f in (IB.txt) DO ( 

       set IB=%%f

       net use /delete k: /y >nul
       net use k: \\!IB!\c$\users\user /user:User nokia >nul

       robocopy k:\Desktop\ d:\stacje\!IB!\Desktop /s /MAX:102400 /LOG:d:\stacje\logs\!IB!_deskt_%date%.txt /r:1 /w:1 >nul
       robocopy k:\Documents\ d:\stacje\!IB!\Documents /s /MAX:102400 /LOG:d:\stacje\logs\!IB!_docs_%date%.txt /r:1 /w:1 >nul
       net use /delete k: /y >nul
       7z u -r -mx=7 -ms=off D:\stacje\!IB!_%date%.7z D:\stacje\!IB!
       rmdir /s /q d:\stacje\!IB!

       forfiles /p "d:\stacje\logs" /s /m *.* /c "cmd /c Del @path" /d -7 
       forfiles /p "d:\stacje" /s /m *.* /c "cmd /c Del @path" /d -7 

)

 

Musi teraz działać. Zrobiłem prosty test z kopiowaniem plików i poszło. W pliku IB.txt miałem nazwy plików (bez rozszeżenia i ścieżki).

 

192.168.0.1
192.168.0.2
192.168.0.3

 

 

@echo off
setlocal EnableDelayedExpansion
FOR /f "tokens=*" %%f in (IB.txt) DO ( 

       set IB=%%f     

       copy !IB!.txt !IB!_%date%.txt


)

 

Nowe skopiowane pliki miały poprawnie doklejoną date.

c42414d685.png

Edytowane przez Atak_Snajpera

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...