POWERSHELL Skript

Programovacie jazyky, rady, poradňa...
IMI
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3213
Registrovaný: 28 jan 2005, 17:39
Bydlisko: KE
Kontaktovať používateľa:

POWERSHELL Skript

Príspevok od používateľa IMI »

Caute, potrebujem pomoct s jednym skriptom v .bat subore. V priecinku sa nachadza cca 24 txt suborov. Po spusteni bat skriptu chcem aby sa v kazdom jednom subore spravilo to ze:
- na konci suboru sa nachadza riadok (obcas riadky), ktore obsahuju aktualny datum a iste informacie. chcem aby sa na tom riadku porovnal datum a slovo SUCCESS, ak ano tak sa ten subor presunie do priecinka AAA, ak tam nebude subor s aktualnym datumom alebo nebude tam slovo SUCCESS ale FAILED tak subor ostane v tom istom priecinku
- tam bude viac riadkov s aktualnym datum ale pri kazdom riadku s aktualnym datumom nebude SUCCESS ale niekde bude nap. FAILED tak sa s tym suborom nevykona nic, tj. ostane v tom priecinku.

Suma sumarum. po spusteni programu sa porovna aktualny datum s datumom (ten sa bude nachadzat na konci suboru) v subore a pri datume bude stav SUCCESS alebo FAILED, pokial bude SUCCESS tak sa subor presunie do ineho priecinka, pokial bude FAILED tak sa s nim nevykona nic. Ak tam bude viac datumov (ktore sa budu zhodovat s aktualnym datumom) a staci ze pri 1 datume bude slovo FAILED tak sa so suborom nevykona nic, ak pri vsetkych bude SUCCESS subor sa presunie do ineho priecinka.

Moj vytvor, ktory by som chcel upravit

Kód: Vybrať všetko

@echo off
::DATE
set year=%date:~-4%
set month=%date:~3,2%
if "%month:~0,1%" == " " set month=0%month:~1,1%
set day=%date:~0,2%
if "%day:~0,1%" == " " set day=0%day:~1,1%
set datef=%day%.%month%.%year%

::PATHS
set approvedPath="D:\file\AAA"
set logs="D:\file\*.txt"

IF EXIST D:\file\entries.txt type entries.txt | findstr %datef% 
goto :success
ELSE
goto :failed

:success
MOVE /Y D:\file\entries.txt "%approvedPath%"
goto :EOF

:failed
goto :EOF
Taketo riadky sa nachadzaju v kazdom subore:

Kód: Vybrať všetko

backup | 06.10.2015 05:50:41 | 111111111 | SUCCESS | 0 | | 0 error(s) occured, see: /example.txt.

EDIT: Skusam odseparovat datum aj cas, ale akonahle ho ulozim do premennej tak mi nevzpise vsetko ale len 1. riadok

Kód: Vybrať všetko

::SEPARATE DATE
for /f "tokens=2 delims=| " %%a in (D:\file\entries.txt) do (
  set sepDate=%%a)
  
::SEPARATE STATE
for /f "tokens=5 delims=| " %%g in (D:\file\entries.txt) do (
  set sepState=%%g)
Textaky (tie 24) maju cca po 20-40Mb. Dakujem za pomoc

//autoeditácia príspevku (13 Okt 2015, 8:35)
Nikto nic?

//autoeditácia príspevku (27 Okt 2015, 13:00)
Nikto nic? Moze to byt aj v PowerShelli
aacid
Hardcore addict
Hardcore addict
Príspevky: 8135
Registrovaný: 22 nov 2006, 21:55
Bydlisko: BA

Re: BAT Skript

Príspevok od používateľa aacid »

preco to musi byt zrovna bat script?
mam pocit ze s takym niecim robi fakt malokto, preto ti nikto neodpoveda...

tiez nemozes cakat ze to niekto spravi za teba, napis s cim konkretne mas problem, potom sa mozno niekto najde.
IMI
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3213
Registrovaný: 28 jan 2005, 17:39
Bydlisko: KE
Kontaktovať používateľa:

Re: BAT Skript

Príspevok od používateľa IMI »

Pisem ze moze to byt aj v PowerShell.
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8216
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: BAT Skript

Príspevok od používateľa harrison314 »

Skus toto, je to napisane z hlavy, takze tam budu chyby. Ale na inspiraciu to hadam staci.

Kód: Vybrať všetko

$files = Get-ChildItem "tvoja cesta ku pricnku" -Filter *.txt
$curentDate = Get-Date -Format "dd.mm.yyyy"
foreach($file in $files)
{
  $failed = false;
  $succ = false;
  foreach($line in Get-Content $file.FullName)
  {
    if($line -contans "*$curentDate*" && $line -contans "FAILED")
	{
	 $failed = true;
	 break;
	}
  }
  if($failed)
  {
   break;
  }
  
  foreach($line in Get-Content $file.FullName)
  {
    if($line -contans "*$curentDate*" && $line -contans "FAILED")
	{
	$succ = true;
	 break;
	}
  }
  
  if($succ && !$failed)
  {
    Move-Item $file.FullName "tvoj novy folder"
  }

}
IMI
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3213
Registrovaný: 28 jan 2005, 17:39
Bydlisko: KE
Kontaktovať používateľa:

Re: POWERSHELL Skript

Príspevok od používateľa IMI »

Dik za odpoved. Momentalne sa snazim aby mi presunulo subor, na zaciatok 1 do priecinku.

Kód: Vybrať všetko

$file = "D:\fail.txt"
$currentDate = Get-Date -Format "dd.MM.yyyy"

$lines = Get-Content $file
echo $lines


foreach($line in Get-Content $lines)
{
    if($line -match $currentDate -AND $line -match "FAILED") 
    {       
        echo $file
        Move-Item $file "D:\approved"
    }
}
Ale vyhadzuje mi hlasku

Kód: Vybrať všetko

Get-Content : Cannot find drive. A drive with the name 'xxx | 05.11.2015' does not exist.
Nema aky drive hladat, lebo obsah medzi ' ' je v tom .txt
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8216
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: POWERSHELL Skript

Príspevok od používateľa harrison314 »

Skus ci ti to iste spravi, ked budes mat subory na C-ecku.
IMI
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3213
Registrovaný: 28 jan 2005, 17:39
Bydlisko: KE
Kontaktovať používateľa:

Re: POWERSHELL Skript

Príspevok od používateľa IMI »

Ano to iste.
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8216
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: POWERSHELL Skript

Príspevok od používateľa harrison314 »

Skus ten powerShell script spustit ako admin, mne Get-Content ide tak ako ma.
IMI
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3213
Registrovaný: 28 jan 2005, 17:39
Bydlisko: KE
Kontaktovať používateľa:

Re: POWERSHELL Skript

Príspevok od používateľa IMI »

Trocha som to poupravil a uz to funguje. Chcem sa spytat. Potrebujem nejaku funkciu alebo ako najlepsie docielit to, ze treba mi porovnat riadky. Kazdy z riadkov obsahuje datum vcerajsi a predvcerajsi. Avsak v 1 riadku je len 1 datum. A potrebujem v dokumente porovnat ci obsahuje tieto datumy. Nasiel som nieco taketo:

Kód: Vybrať všetko

function Get-Lines {
    [cmdletbinding()]
    param(
        [string]$filename,
        [string]$word
    )

    if( Test-Path -Path $filename -PathType Leaf -ErrorAction SilentlyContinue ) {
        # filename exists, and is a file
        $lines = Get-Content $filename
        foreach ( $line in $lines ) {
            if ( $line -like "$word*") {
                $line
            }
        }
    }
}
Avsak tu viem dat 1 parameter co sa nachadza iba 1 riadku. A treba mi nech ocekuje 1 riadok s vcerajsim datumom a dalsi riadok s predvcerajsim. Ak tieto datumy oba chybaju alebo 1 z nich tak ma vyhodit chybu. Zmena v ife

Kód: Vybrať všetko

( $line -like "$word*" -OR $line -like "$word2*")
nepomaha, kedze v konkretnom riadku musi byt aspon 1 datum. Dik vopred
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8216
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: POWERSHELL Skript

Príspevok od používateľa harrison314 »

Preco to nerobis pocane?
Preco najskor nenajdes riadok zo vcerajsim datumom, a potom sa pozries ci na dalsom nie je dnesny?
IMI
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3213
Registrovaný: 28 jan 2005, 17:39
Bydlisko: KE
Kontaktovať používateľa:

Re: POWERSHELL Skript

Príspevok od používateľa IMI »

harrison314 napísal:Preco to nerobis pocane?
Preco najskor nenajdes riadok zo vcerajsim datumom, a potom sa pozries ci na dalsom nie je dnesny?
Pocane?
Najdem riadok s vcerajsim datumom a potrebujem najst este riadok s predvcerajsim. Ak su tam obidve datumy tak sa ma subor prekopirovat do ineho foldra...
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8216
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: POWERSHELL Skript

Príspevok od používateľa harrison314 »

IMI napísal:Pocane?
Malo to byt opacne.
IMI napísal:Najdem riadok s vcerajsim datumom a potrebujem najst este riadok s predvcerajsim. Ak su tam obidve datumy tak sa ma subor prekopirovat do ineho foldra...
Takze uz je jedno, kde sa tie datumy nachadzaju?
IMI
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3213
Registrovaný: 28 jan 2005, 17:39
Bydlisko: KE
Kontaktovať používateľa:

Re: POWERSHELL Skript

Príspevok od používateľa IMI »

V subore je plno riadkov s roznym textom, avsak 1riadok stale obsahuje vcerajsi datum a 1 riadok obsahuje predvcerajsi datum. Ak sa v subore nachadzaju oba tieto riadky tak vtedy sa ma ten subor premiestnit.
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8216
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: POWERSHELL Skript

Príspevok od používateľa harrison314 »

Nestaci na to jednoduche vyhladanie v subore?
Budes mat 2 bool hodnoty.
Prechadzas subor po riadkoch
- hladas vcerajsi datum, ak najde nasvais prvu bool premennu na true
- hladas predvcerajsic datum, ak ho najdes nastavis druhu bool premennu na true

Ak sa su obe true presunies subor.

//autoeditácia príspevku (13 Jan 2016, 15:25)
PS: vcerajsi datum dostanes

Kód: Vybrať všetko

(Get-Date).AddDays(-1).ToString("dd.MM.yyyy")
IMI
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3213
Registrovaný: 28 jan 2005, 17:39
Bydlisko: KE
Kontaktovať používateľa:

Re: POWERSHELL Skript

Príspevok od používateľa IMI »

harrison314 napísal:Nestaci na to jednoduche vyhladanie v subore?
Budes mat 2 bool hodnoty.
Prechadzas subor po riadkoch
- hladas vcerajsi datum, ak najde nasvais prvu bool premennu na true
- hladas predvcerajsic datum, ak ho najdes nastavis druhu bool premennu na true

Ak sa su obe true presunies subor.

//autoeditácia príspevku (13 Jan 2016, 15:25)
PS: vcerajsi datum dostanes

Kód: Vybrať všetko

(Get-Date).AddDays(-1).ToString("dd.MM.yyyy")
Takto to mam momentalne: http://pastebin.com/iXaPfdX5

Snazim sa nastavit hodnotu na true ci false ale nedari sa mi. Neviem sa dopracovat ku kroku ked mam napr. 2 subory s roznymi nazvami ale spol. vcerajsim datumom a kazdy z nich obsahuje vo vnutri 1x vcerajsi datum a 1x predvcerajsi, a po zmene jedneho suboru o iny datum mi ho ajtak presune do foldra. neviem jak zlucit to nech hlada aj jeden aj druhz neja ks prepinacom AND.
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8216
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: POWERSHELL Skript

Príspevok od používateľa harrison314 »

Skus zmenit

Kód: Vybrať všetko

if($resultYest = $TRUE)...
na

Kód: Vybrať všetko

if($resultYest -eq $TRUE)
a aj v druhom pripade.

Nesedi mi to. Je moznost ze namiesto vyhodnotenia to priradi hodnotu.
Este sa na to pozriem vecer.
IMI
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3213
Registrovaný: 28 jan 2005, 17:39
Bydlisko: KE
Kontaktovať používateľa:

Re: POWERSHELL Skript

Príspevok od používateľa IMI »

Jop to je najmenej, len mne nefunguje to, ze neviem presne akym prikazom viem vyhladat oba datumy zaroven a po zmene jedneho nech automaticky berie subor ako false. False berie len vtedy ak ten datum je zmeneny v obidvoch suboroch.
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8216
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: POWERSHELL Skript

Príspevok od používateľa harrison314 »

Prezard mi co si myslel tymto

Kód: Vybrať všetko

#01.############# Start YESTERDAY ##############
foreach($file in $summYesterday){
$resultYest = Select-String -Path $summYesterday -Pattern "$yesterday", "$befYesterday"
}
IMI
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3213
Registrovaný: 28 jan 2005, 17:39
Bydlisko: KE
Kontaktovať používateľa:

Re: POWERSHELL Skript

Príspevok od používateľa IMI »

Nakoniec som to upravil a slape to. Hned po najdeni stringu subor spracuje. Predtym som to mal tak, ze najprv sa stringy nachadzali a tak sa spracuvavali.
Napísať odpoveď