Pitäisi saada tehtyä skripti joka testaa onko työasema online-tilassa vai ei ja ilmottaisi sen sitten. Onko tällainen mahdollista tehdä ihan perus "windows/dos"-skriptinä?
skripti
skriptooja
361077
0Äänestä
Muut lukivat myös
Odottaa vastausta
Näihin keskusteluihin ei ole vielä vastattu. Ole ensimmäinen.
Vastaukset 36
Vanhimmat
net view | find /c "\\Työasema"
Tuo tulostaa 1, jos työasema löytyy.
net view | find "\\Työasema"
tai
net view | find "tietokoneen kuvaus"
Tämä tulostaa rivin, jolla on työaseman nimi ja tietokoneen kuvaus
Noista voisi jotain kehitellä.
Kiitos paljon! Mikähän mahtaa olla että nämä määritykset eivät tuota oikeanlaista tulosta antamasi rivin kanssa?
net view | find /c "\\KONE1"
if ERRORLEVEL=1 echo Työasema löytyy verkosta
if ERRORLEVEL=0 echo Työasema ei ole kytkettynä verkkoon
Nyt kyseiset rivit tulostavat molemmat tekstit, jos työasema ei ole verkossa. Ja jos työasema on verkossa tuo tulostaa että työasema ei ole kytkettynä verkkoon. Missä tuo menee metsään?
tuloksen mukaan, vaan tulostaa rivien määrän.
Pitäisi testata jollain sen tulostus.
@echo off
ping 192.168.0.1 -n 1 | find /i "ttl=" > nul
if %ErrorLevel%==0 echo "Online"
if %ErrorLevel%==1 echo "Offline"
vaihtoehtoisesti:
@echo off
net view | find /c "\\KONE1" > nul
if %ErrorLevel%==0 echo "Online"
if %ErrorLevel%==1 echo "Offline"
Kiitos ratkaisusta!
pitääpä miettiä miksi.
c-parametri vain listaa niiden rivien lukumäärän joilla haettava merkkijono esiintyy.
Kun /C valitsin tulostaa 0:n NUL:iin, niin se aiheuttaa ErrorLevel=1
ja kun se tulostaa esim. 1:n, niin se aihettaa ErrorLevel=0 tai siis ei aiheta virhettä.
Kokeilin samaa tulostamalla tekstitiedostoon
net view | find /c "\\KONE1" > tulostus.txt
ja laitoin rivin
del tulostus.txt
viimeiselle riville. Toimi samalla tavalla.
Tuo on tietysti suunniteltu ominaisuus, mutta sitä ei arvaamalla taitaisi keksiä.
Ainoastaan kokeilemalla vahingossa tai sitten opiskelemalla.
sehän tulostaa sinne sen rivin, minkä se tulostaa näytölle ilman c-valitsinta, eikä sitä nollaa tai muuta numeroa.
Numero tulostetaan vain näytölle (tai stdout ?).
Minä luulin sen tulostavan tiedostoon saman kuin näytölle. Mutta se tulostaankin tiedostoon aina rivin.
Kiitos paljon viesteistä nyt tuo toimii kuin junan vessa.
Nyt olisi vielä tarpeen skriptiin sellainen ominaisuus/looppi, mikä lukisi toisesta tiedostosta tietokoneen nimen.
tiedostossa eri kentät on erotettu pilkuilla.
esim.
tietokone1, konesalissa, blah
tietokone2, neuvotteluhuone, blahblah
Saisinko jotenkin helposti loopilla siis niin että tuohon aikaisempaan skriptiin otettaisiin aina tuo tietokoneen nimi tuosta ekasta kentästä. ja käytäisiin kaikki rivit läpi kunnes tiedostosta loppuvat rivit.
Lisäksi pitäisi saada aina ennen tuota testausta että onko kone online vai offline, tulostettua tuo koko rivi kaikkine kenttineen.
Tiedän että FOR-komento on olemassa, mutta ei ole juuri mitään hajua että miten tällainen skripti toteutettaisiin...
Muuten tämä nyt toimii, mutta tuo find-komennossa oleva polku-niminen muuttuja ei toimi. Miten se pitäisi laittaa, että siihen tulostuisi tuo koneeen nimi? Kiitos jälleen kerran.
@echo off
FOR /F "tokens=1,3* delims=," %%G IN (myfile.csv) DO (
echo %%G %%H
set polku=\\%%G%
net view | find /c "%%polku" > nul
if %ErrorLevel%==0 echo "Online"
if %ErrorLevel%==1 echo "Offline"
)
pause
tulkitaan yleensa kirjaimellisesti eli "%%polku" tarkoittaisi %%polku eikä muuttujan arvoa (sisältöä).
Kokeile ilman sitaatteja.
Sitten voisi kokeilla siirtää apumuuttujalle, jollei toimi suoraan.
Mulla on kohta 25 vuotta kun olen viimeksi yrittänyt tosissani vääntää mitään koodia (en tunne termejä, joten termi "koodia" saattoi olla väärin).
Siksi ohje on vain suuntaa antava.
Normaalikielessä sitaatit tarkoittavat, että ei pidä ottaa kirjaimellisesti.
Mielenkiintoinen seikka, mistä johtuu.
Linuxin bash komentokielessä:
- yksinkertainen lainausmerkki (')vastaa kait sitaattia " Windows/DOS:ssa
- kaksin kertaisissa lainausmerkeissa (") tulkitaan ympäristömuuttujat
- Hipsumerkkien (` [plusmerkin vieressä SHIFT:n kanssa]) sisältä lasketaan esim. ohjeman antama arvo
Eli linxin komentorillä olisi ympäristömuuttuja tulkittu?
Entä sitte MS:n uusi komentorivi (Saatavilla Vistaan?)?
Näin kokeilin nyt ja SET-komento näyttää että polku-muuttuja saa todella arvokseen merkkijonon: "\\%%G%" , missä &&G% tilalle tulostuu tietokoneen nimi. Tuohon find-komentoon kokeilin eritavoin laittaa tuon polku-muuttujan mutta ei auttanut. Jos laitan %%polku% tulostuu find-komentoon %polku, jos laitan %%polku tulostuu myös tällöin find-komentoon %polku, muuttujan sisältämän arvon sijasta.
Jos laitan %polku tulostuu find-komentoon polku.
Miten saisin tuon toimimaan niin että siihen tulostuisi muuttujan sisältö eikä itse muuttujan nimi?
rem @echo off
FOR /F "tokens=1,3* delims=," %%G IN (myfile.csv) DO (
echo %%G %%H
set polku="\\%%G%"
set polku
net view | find /c %%polku > nul
if %ErrorLevel%==0 echo "Online"
if %ErrorLevel%==1 echo "Offline"
)
pause
prosenttimerkkien sisällä, kun sen arvoa haetaan
net view | find /c %polku% > nul
http://www.computerhope.com/sethlp.htm
http://www.robvanderwoude.com/set.html
%%muuttuja on taas for silmukkamuuttuja
http://www.robvanderwoude.com/for.html
%polku% tulostaa vain tyhjän tuohon find-komentoon vaikka set:llä näkee, että polku-muuttujassa todella on sisältöä... Lisää ideoita?
net view | find "%polku%" > nul
minulla se vaan tulosti (rem @echo off) rivin
net view | find "KONE1" 1>nul
(/c otin pois, sitä ei kai tarvitse)
ja jumitti tuohon. Joku ykkönen sinne tunkee.
tulosta net view komennolla teksititiedostoon
net view > netview.txt
ja sitten voit käyttää find hakua tähän tekstitiedostoon. Nopeuttaa suoritusta, kun riittää yksi skannaus kaikille koneille.
for silmukka
find "%polku%" netview.txt > nul
if %ErrorLevel%==0 echo "Online"
if %ErrorLevel%==1 echo "Offline"
koska find tulostaa tiedostosta aina sen nimen (isoilla kirjaimilla) ensimmäiselle riville, vaikka ei löytyisikään yhtään osumaa, niin se pitää suodattaa pois
for silmukka
find /v "NETVIEW.TXT" netview.txt | find "%polku%"
if %ErrorLevel%==0 echo "Online"
...
for silmukka
find /v "NETVIEW.TXT" netview.txt | find "%polku%" > nul
if %ErrorLevel%==0 echo "Online"
...
Vieläkin sama ongelma.. tuonne findin "hipsujen" väliin ei tulostu mitään vaikka siellä on %polku%
ja pitäisi tulostua tuo koneen nimi. Mistä voisi johtua?
eli näin tulostuu:
find /v "NETVIEW.TXT" netview.txt | find "" 1>nul
vaikka pitäisi jotenkin näin:
find /v "NETVIEW.TXT" netview.txt | find "\\KONE1" 1>nul
Onko sinulla siellä rivi vielä
set polku="\\%%G%"
miksi siinä lopussa on prosentti.
Ota lainausmerkit pois.
Kokeile tätä.
set polku=\\%%G
Mitä näyttää
echo %polku%
joo lainausmerkit on tuosta pois. kokeilin myös lopun prosenttimerkin ottaa pois, mutta ei vaikutusta.
echo %polku% näyttää vain: "Echo käytössä."
mutta sen sijaan set polku näyttää että muuttujalla olisi arvo tyyliin: \\KONE1
hmm.. vielä ideoita?
"Echo käytössä" tai "Echo ei käytössä" ilmoitus tulee ajettaessa komentojonotiedostoa, kun on kirjoitettu sellainen muuttuja prosenttimerkkien sisään, jota ei ole (esimerkiksi kirjoitusvirhe).
Tuo selittäisi ristiriitaisen tuloksen.
Eli sinulla on ilmeisesti %polku% muuttuja oikein, koska set komento tulosti sen oikein (\\KONE1)
Sitten pitäisi tarkistaa rivi
find /v "NETVIEW.TXT" netview.txt | find "%polku%" > nul
Mulla kun se toimii.
voisitko laittaa tänne koko komentojonotiedoston, kun meni jo sekaisin mikä on tämänhetikinen tilanne.
Tämän kopioin aikaisemmasta viestistäsi
rem @echo off
FOR /F "tokens=1,3* delims=," %%G IN (myfile.csv) DO (
echo %%G %%H
set polku="\\%%G%"
set polku
net view | find /c %%polku > nul
if %ErrorLevel%==0 echo "Online"
if %ErrorLevel%==1 echo "Offline"
)
pause
Kunhan poistat sitaatit ja %-merkin ja lisäät sitaatit toiseen kohtaan jne.. (taisin kopsata vanhan version, mutta korjasin huomaamani/luulemani virheet.
eli oikein olisi (jätin tarkistusmuotoon eli en poistanut tulostuksia väliltä)
rem @echo off
FOR /F "tokens=1,3* delims=," %%G IN (myfile.csv) DO (
echo %%G %%H
set polku=\\%%G
set polku
net view | find "%polku%" > nul
if %ErrorLevel%==0 echo "Online"
if %ErrorLevel%==1 echo "Offline"
)
pause
En jaksanut ajatelle enää tuota ehdottamaani muutosta, jossa tulostetaan tekstitiedostoon ja sen sovittamista sinun komentojonoosi.
Myöskään for silmukkaa en tarkistanut, kun en ottanut tarkemmin selvää.
eli jostain kumman syystä tuo find-komento ei saa tuota muuttujan arvoa :S omituista kyllä jos sulla toimii...
rem @echo off
net view > netview.txt
FOR /F "tokens=1,3* delims=," %%G IN (myfile.csv) DO (
echo %%G %%H
set polku=\\%%G
set polku
echo %polku%
find /v "NETVIEW.TXT" netview.txt | find "%polku%" > nul
if %ErrorLevel%==0 echo "Online"
if %ErrorLevel%==1 echo "Offline"
)
pause
Testasin viimeksi tällä
set koe=KONE1
net view > netview.txt
find /v "NETVIEW.TXT" netview.txt | find "%koe%" > nul
if %ErrorLevel%==0 echo "Online"
if %ErrorLevel%==1 echo "Offline"
ja tässä tulos
E:\>onkokone.cmd
E:\>set koe=KONE1
E:\>net view 1>netview.txt
E:\>find /v "NETVIEW.TXT" netview.txt | find "KONE1 " 1>nul
E:\>if 0 == 0 echo "Online"
"Online"
E:\>if 0 == 1 echo "Offline"
E:\>
Sinullahan tulosti set polku oikean arvon.
(ja echo varmaankin)
E:\>find /v "NETVIEW.TXT" netview.txt | find "KONE1 " 1>nul
niin mulla tulee vieläkin tohon find-komentoon vaan näin:
E:\>find /v "NETVIEW.TXT" netview.txt | find "" 1>nul
voiko koneen jotkut asetukset vaikuttaa tähän?
for silmukassa ei toiminut sijoitus set=\\A% vaan muuttuja jämähti samaan arvoon.
Sitten sijoitin suoraan
find /v "NETVIEW.TXT" netview.txt | find "%%A" > nul
Nyt toimi muuten, mutta errorlevel jämähti ensimmäiseen arvoon.
Pitäisi käyttää call funktiotta ja toista komentojonoa testaukseen.
Pitäsikä sitä kokeilla.
Simukka toiseen ja se kutsuisi testausta toisesta komentojonosta. Voisi ratkaista molemmat ongelmat.
joo näyttää toimivan ilman for-silmukkaa eli jotenkin se ei osaa käyttää tota muuttujaa siinä. Olisiko tähän jotain ratkaisua?
FOR %%A Silmukkaehto DO CALL TEST2.BAT %%A
%%A välittyy TEST2.BAT tiedostolle %1:nä (ensimmäinen parametri)
http://www.robvanderwoude.com/parameters.html
pääkomentojono
------------------------------------------
net view > netview.txt
for %%A in (KONE1 KONE2 KONE3) DO call onkokonetesti.cmd %%A
******************************************
Testikomentojono nimelle onkokonetesti.cmd
------------------------------------------
set polku=%1
echo %polku%
find /v "NETVIEW.TXT" netview.txt | find "%polku%" > nul
if %ErrorLevel%==0 echo "Online"
if %ErrorLevel%==1 echo "Offline"
-------------------------------------------
eli kenoviivat eivät haitanneet.
set polku=\\%1
echo %polku%
find /v "NETVIEW.TXT" netview.txt | find "%polku%" > nul
if %ErrorLevel%==0 echo "Online"
if %ErrorLevel%==1 echo "Offline"
tällä ohjeella sain toimimaan. kiitos paljon avusta!
kun olen niin laiska opettelemaan ulkoa asioita.
Pitää aina olla joku tehtävä, mitä varten hakee tietoa.
Varmaan olisi hyvä ratkoa muutamia tuollaista tehtävää, niin olis perusteita hanskassa.