Sziasztok!
- Környezet: windows 10, NTFS fájlrendszer.
- Egy mappában van körülbelül 1000 fájl (az alább részletezetteken kívül 4-6 db egyéb állomány van a mappában)
Fájlnévsablon: bizfejXXX000.bsb és biztetXXX000.bsb ezek sima szöveges állományok, tabulátorral tagolva
A fájlok párban vannak. Minden bizfej[bizonylatfej]-hez tartozik egy biztet[bizonylattétel] fájl is.
Feladat:
Meg kell keresni a bizfejXXX000.bsb fájlok közül azokat, amelyekben szerepel a 'feldolgozva' string.
A hozzá tartozó biztet fájllal együtt ezt át kell mozgatni egy előzetesen megadott mappába.
Milyen megoldás lenne erre e legegyszerűbb? Windows power shell (?) Python-ban vagy bármilyen más nyelven egy program írása? Minden megoldás érdekel! Nem konkrét megoldás érdekel, hanem hogy ki mit használna ennek a megoldására, kisvállalati környezetben. [mikrovállalati]
A programot, szkriptet rendszeresen, napi szinten egyszer le kellene futtatni, hogy a feldolgozott állományokat máshová helyezze.
Nem, a létrehozó programba nem tudok belenyúlni, azt az oldalt felejtsük el.
Minden építő jellegű ötletet köszönök!
- 5022 megtekintés
Hozzászólások
Ha tudsz PowerShell-ül, akkor PowerShell, ha nem, de tudsz VBScript-ül, akkor az, ha nem, akkor Python (hogy ne feltétlenül kelljen plusz dolgokat telepíteni, vagy ha már kell, akkor a lehető legkevesebb - sima shell script is elég lenne neki, de egy teljes cygwin/msys/Linux Subsystem for Windows/akármi mást csak azért feltenni overkill)
Aztán feladatütemező.
BlackY
--
"en is amikor bejovok dolgozni, nem egy pc-t [..] kapcsolok be, hanem a mainframe-et..." (sj)
- A hozzászóláshoz be kell jelentkezni
Én csak phpistis tudok gyorsan :(
<?php
$in="c:\\input";$out="c:\\output";
foreach (scandir($in) as $file)
if (preg_match("/bizfej(.{3})000.bsb/i",$file,$list) && preg_match("/feldolgozva/",file_get_contents($in.DIRECTORY_SEPARATOR.$file)))
{
rename($in.DIRECTORY_SEPARATOR.$file,$out.DIRECTORY_SEPARATOR.$file);
$file[3]='t';$file[5]='t';
rename($in.DIRECTORY_SEPARATOR.$file,$out.DIRECTORY_SEPARATOR.$file);
};
- A hozzászóláshoz be kell jelentkezni
Perl lehet gyors megoldás, ha nem megy a vbscript vagy powershell - ahhoz nem kell sokat telepíteni és stabil. A kód php-hez hasonlóan pár sor és a leggyorsabb mintaillesztő a c-t leszámítva.
- A hozzászóláshoz be kell jelentkezni
Irj valami programot vagy scriptet abban a nyelvben amihez ertesz es a leheto legkevesebb fuggosege van.
- A hozzászóláshoz be kell jelentkezni
+1
- A hozzászóláshoz be kell jelentkezni
Mindenkinek köszönöm a válaszokat, a php lett a nyertes, mert ahhoz értek annyira, hogy képes legyek megvalósítani.
- A hozzászóláshoz be kell jelentkezni
Bár kicsit offtopic, de...
Egy mappában van körülbelül 1000 fájl
Az ilyen dilettáns rendszert villámgyorsan ki kellene irtani!
Bár akkor talán nem lenne problémád, feladatod...
- A hozzászóláshoz be kell jelentkezni
Mitől dilettáns egy rendszer, ha 1000 fájlt tárol egy mappában? Itt egy progi, épp 12000 fájl van az egyik mappájában. Cyrus-imapd a neve.
- A hozzászóláshoz be kell jelentkezni
át kéne állni mboxra, nincs mese, az a fasza :D
- A hozzászóláshoz be kell jelentkezni
Nem mintha kötözködnék...
A cyrus egy darab filét sem tárol mappában.
Indoklás:
1) Mappa a vindózon van.
2) A cyrus ún. maildir tárolást végez és nem mailmap. ;)
3) Igaz, a cyrus tárolhat 12000 fájlt egy helyen, de csak kényszerből, a trehány felhasználók miatt.
Azért mert megteheted, nem biztosan helyes.
4) A cyrus nem fut vindózon. (Vagy le vagyok maradva, de a cygwin nem ér.)
A kötözködést befejezvén.
Mindezt csak rutinból mondtam, mivel láttam már néhány - magukat igen okosnak tartó ember által elkövetett - rosszul működő rendszert.
Ami különös pikantériája a véleményemnek, hogy kifejezetten Windows környezetben még nagyobb ostobaság a sok fájl tárolása a szarul működő cache miatt. És itt nem az általam használt XP/SP2-ről van szó, hanem azokról a tesztekről, amit utoljára Window Server 2008R2/32GB ram/64 bites környezetben végeztem. Tekintettel arra, hogy semmivel sem kaptam jobb eredményt, mint a saját gépemen, élek a rosszindulattal: ez a fícsör a világ végéig meg fog maradni.
Visszatérve a cyrus-ra. Az azért eléggé kiforrott rendszer a topicnyitó rendszerhez képest. Bár ez is csak egy rosszindulatú sejtés. ;)
Szóval ez egy tapasztalaton alapuló vélemény, nem több. A cyrus jo válasz volt rá! :D
- A hozzászóláshoz be kell jelentkezni
Hát személy szerint biztos .BAT fájlt írnék rá. A régi command.com-nál a cmd.exe W10-ben már biztos okosabb, de a "find" elég régi parancs, az "if" is, (ez kb. az fgrep), a move az 6.0-s DOS óta létezik - úgy kb ezek kellenének hozzá. De tényleg nem triviális a dolog, mert legalább 10 éve nem kellet BAT-fájlokat írjak.
- A hozzászóláshoz be kell jelentkezni
Powershellt mindenképp érdemes megtanulni szerintem annak, aki Windows környezetben mozog. Egyrészt baromi jól integrálódik a Microsoftos cuccokkal, egész komoly programok is összerakhatóak vele azáltal, hogy ott van mögötte a .NET. Nekem nagyon tetszik, hogy deklaratív módon programozható, és objektumok utaznak a pipelineokon, nem kell string reszeléssel foglalkozni. Szórakozásból összeraktam a feladatot megoldó scriptet:
$sourceDir = 'innen'
$targetDir = 'ide'
ls -Path $sourceDir -Filter 'biz*.bsb' |
group {$_.Name -replace '^biz(fej|tet)'} |
where {$_.Group | where {$_.Name -match '^bizfej'} | cat | where {$_ -match 'feldolgozva'}} |
foreach {$_.Group | mv -Destination $targetDir}
- A hozzászóláshoz be kell jelentkezni
Ez igen! Köszönöm!
- A hozzászóláshoz be kell jelentkezni
PowerShell egysoros megoldás:
(gci bizfej*000.bsb |sls "feldolgozva").Path.Replace("fej", "*") |mi -d targetdir
Nem akarod elolvasni, amit ide írtam, mert minden, ami jó/rossz a PowerShell-ben, ebben benne van.
1. gci - Get-ChildItem --> kb. a dir vagy az ls megfelelője, fájllistát ad vissza.
2. sls - Select-String --> kb. a grep megfelelője, azt csinálja, hogy a kapott fájllistán végigmegy, mindegyik fájlban megpróbálja megkeresni a megadott stringet, majd visszaad egy listát, ami a találatokat tartalmazza.
3. A visszaadott listán elemeiről lekérem a Path property-ket, eredmény egy lista természetesen.
4. Ezen a listán meghívom a Replace metódust, ami lefut minden elemre és kicseréli benne a "fej" stringet "*" stringre.
5. mi - Move-Item --> kb. a sima mv parancs, a -d a destination directory, az meg hogy mit mozgasson, az inputként kapott tömbből jön.
PowerShell-ben is kiválóan lehet gányolni :-D
- A hozzászóláshoz be kell jelentkezni