bat/cmd: Ako uložiť výstup príkazu priamo do premennej?

Místo pro dotazy a rady ohledně programovacích jazyků (C++, C#, PHP, ASP, Javascript, VBS..) a tvorby webových stránek

Moderátor: Mods_senior

mederi
Level 2
Level 2
Příspěvky: 164
Registrován: únor 11
Pohlaví: Muž
Stav:
Offline

bat/cmd: Ako uložiť výstup príkazu priamo do premennej?

Příspěvekod mederi » 28 úno 2013 15:05

Poradí niekto, ako by som bez použitia dočasného súboru uložil výstup príkazu priamo do nejakej premennej pre ďalšie spracovanie a prepočet?
Nástroj: MediaInfo
> download stránka: http://mediainfo.sourceforge.net/Download/Windows
> Windows XP - 32 bit - CLI

Použitím dočasného súboru to funguje:

Kód: Vybrat vše

@echo off
MediaInfo.exe --Output="Video;%%DisplayAspectRatio%%_%%Width%%_%%Height%%" %1>tmpSubor.txt
set /p premenna=<tmpSubor.txt
echo Premenna je: %premenna%
pause
Uložte si to do .bat alebo .cmd súboru. Spravte si z toho zástupcu na plochu. Ak na zástupcu pretiahnete nejaký videosúbor, zobrazí sa požadovaná informácia o formáte videa v tvare: stranový pomer_šírka_výška

Pokus o priame riešenie bez dočasného súboru nefunguje. Príkaz ignoruje voľbu --Output=... Výsledkom je posledný riadok z viacriadkového všeobecného výstupu.

Kód: Vybrat vše

@echo off
for /f "delims=" %%a in ('MediaInfo.exe --Output="Video;%%DisplayAspectRatio%%_%%Width%%_%%Height%%" %1') do set premenna=%%a
echo Premenna je: %premenna%
pause

Mám tam niekde chybu?

Reklama
zeus
Elite Level 10.5
Elite Level 10.5
Příspěvky: 11108
Registrován: únor 12
Bydliště: Pankrac
Pohlaví: Muž
Stav:
Offline

Re: bat/cmd: Ako uložiť výstup príkazu priamo do premennej?

Příspěvekod zeus » 01 bře 2013 10:26

Program v druhem pripade opravdu produkuje 'kosaty' vypis a ne jen jeden radek textu. Vsak u --Help-Output pisou, ze je to BETA option. Treba to dalsi verze opravi.
Prazaci jo ty se maj, az kdyz si me zavolaj..

mederi
Level 2
Level 2
Příspěvky: 164
Registrován: únor 11
Pohlaví: Muž
Stav:
Offline

Re: bat/cmd: Ako uložiť výstup príkazu priamo do premennej?

Příspěvekod mederi » 01 bře 2013 17:13

Vďaka, zeus, že si sa na to mrkol. Ak je ten celý príkaz samostatne, tak to funguje presne, ako potrebujem - pekne vráti len vybrané atribúty videa v jednom riadku. Ale ak to zamiešam do príkazu FOR, nastane problém. Zádrheľ bude asi niekde v tom guláši znakov úvodzoviek, percent, bodkočiarky... :?

mederi
Level 2
Level 2
Příspěvky: 164
Registrován: únor 11
Pohlaví: Muž
Stav:
Offline

Re: bat/cmd: Ako uložiť výstup príkazu priamo do premennej?

Příspěvekod mederi » 05 bře 2013 15:04

:idea: Predsa len, nenájde sa tu borec, ktorý by dokázal vyladiť uvedený príkaz?

Uživatelský avatar
CZechBoY
Master Level 9.5
Master Level 9.5
Příspěvky: 8813
Registrován: srpen 08
Bydliště: Brno
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: bat/cmd: Ako uložiť výstup príkazu priamo do premennej?

Příspěvekod CZechBoY » 05 bře 2013 17:53

v linuxu by to šlo, ale ve windowsu si myslím že ne
viz. http://stackoverflow.com/questions/2768 ... -backticks
PHP, Nette, MySQL, C#, TypeScript, Python
IntelliJ Idea, Docker, Opera browser, Linux Mint
iPhone XS
Raspberry PI 3 (KODI, Raspbian)
XBox One S, PS 4, nVidia GeForce NOW

mederi
Level 2
Level 2
Příspěvky: 164
Registrován: únor 11
Pohlaví: Muž
Stav:
Offline

Re: bat/cmd: Ako uložiť výstup príkazu priamo do premennej?

Příspěvekod mederi » 05 bře 2013 22:06

@CZechBoY
Vďaka. Naviedol si ma správnym smerom. Na uvedenej stránke som zbadal použitú voľbu "usebackq" v možnostiach, tak som si to pridal aj ja k "delims=" (rovnako ako "delims=" funguje aj "tokens=*").

Kód: Vybrat vše

for /f "usebackq delims=" %%a in ('MediaInfo.exe --Output="Video;%%DisplayAspectRatio%%_%%Width%%_%%Height%%" %1') do set premenna=%%a
Výsledkom bolo, že sa mi na obrazovke ukázal reťazec celého príkazu, ako ho rozumie počítač. A kde bola tá sviňa? Namiesto znaku "=" tam bola zobrazená len medzera. Takže znakom "^" som okamžite tú svinku zahlušil a raz-dva boli klobásky hotové :smile:

Kód: Vybrat vše

@echo off
for /f "delims=" %%a in ('MediaInfo.exe --Output^="Video;%%DisplayAspectRatio%%_%%Width%%_%%Height%%" %1') do set premenna=%%a
echo Premenna je: %premenna%
pause

Keď už sme pri tej zabíjačke, chcel som si hneď spraviť aj tlačenku v podobe aritmetického výpočtu, no narazil som na ďalší problém.

Kód: Vybrat vše

@echo off
for /f "tokens=1-3 delims=_" %%a in ('MediaInfo.exe --Output^="Video;%%DisplayAspectRatio%%_%%Width%%_%%Height%%" %1') do (
   echo %%a_%%b_%%c
   set pomer_stran=%%a
   set sirka=%%b
   set vyska=%%c
)
echo %pomer_stran%, %sirka%, %vyska%
set /a vypocitany_pomer=sirka/vyska
echo %sirka%/%vyska%=%vypocitany_pomer%
pause
Vypočítaná hodnota je len celé číslo; "640/272=2" a nie niečo ako "640/272=2.351". Aké korenie mi teraz chýba v tej tlačenke? :crazy:

zeus
Elite Level 10.5
Elite Level 10.5
Příspěvky: 11108
Registrován: únor 12
Bydliště: Pankrac
Pohlaví: Muž
Stav:
Offline

Re: bat/cmd: Ako uložiť výstup príkazu priamo do premennej?

Příspěvekod zeus » 05 bře 2013 23:01

Zbytecne to komplikujes, vzdyt uz to jednou vypocitalo MediaInfo, tak proc to nepouzit?
Prazaci jo ty se maj, az kdyz si me zavolaj..

mederi
Level 2
Level 2
Příspěvky: 164
Registrován: únor 11
Pohlaví: Muž
Stav:
Offline

Re: bat/cmd: Ako uložiť výstup príkazu priamo do premennej?

Příspěvekod mederi » 06 bře 2013 15:53

@zeus
Toto tu ešte nie je presne to, čo by som chcel, ale určite to bude výpočet, porovnanie hodnôt a predanie vyhovujúceho výsledku nejakéme programu ako vstupný parameter v príkazovom riadku. Rozumej to ako moju prípravu pre konktrétne riešenie. Zoznamujem sa s možnosťami skriptovania dávkových súborov vo Windows. Zdá sa, že Micro$oft toho DOS-osaura veľmi nevylepšil. Ale dám tomu ešte šancu.

Takže k tým výpočtom som vyGooglil toto:
Floating point division in a dos batch
> Add floating point numbers in batch file
> Stupid Coding Tricks: A Batch of Pi
Zdá sa, že dočasným súborom sa vyhnúť nedá. Alebo je možno niekde nejaká CLI utilitka na výpočty: predať jej hodnoty ako vstupné parametre a vráti výsledok. Ďalšie vyskakujúce čierne okienka.

Je dobré vedieť aj o tej možnosti použitia linuxového skriptovania Bash priamo vo Windows namiesto toho blba Batch:
MSYS with MinGW
Má tu s tým niekto skúsenosti?
Alebo ďalšia možnosť: Windows PowerShell

zeus
Elite Level 10.5
Elite Level 10.5
Příspěvky: 11108
Registrován: únor 12
Bydliště: Pankrac
Pohlaví: Muž
Stav:
Offline

Re: bat/cmd: Ako uložiť výstup príkazu priamo do premennej?

Příspěvekod zeus » 06 bře 2013 20:47

Pokud to zamyslis trochu vazneji, PowerShell te asi nemine. Bash for Win ma zopar omezeni proti plnotucne verzi. Ale co treba jednodussi skripty v VBS?
Prazaci jo ty se maj, az kdyz si me zavolaj..

mederi
Level 2
Level 2
Příspěvky: 164
Registrován: únor 11
Pohlaví: Muž
Stav:
Offline

Re: bat/cmd: Ako uložiť výstup príkazu priamo do premennej?

Příspěvekod mederi » 06 bře 2013 23:20

No práve pozerám aj ďalšie zdroje, ako sa rieši "zložitejšia" aritmetika v tom dávkovom skripte. Väčšinou sa to rieši jednoduchým .vbs skriptom v rôznych menších obmenách. Ten .vbs skript sa buď automaticky vytvorí ako dočasný súbor priamo z .bat, alebo sa ručne pripraví vopred ako príloha toho .bat, takže nie je potrebné zháňať po Internete nejaké CLI kalkulátoriky.
"karkulka.vbs":

Kód: Vybrat vše

Randomize
Const pi=3.14159265358979
Wscript.echo eval(WScript.Arguments(0))
WScript.Arguments(0) je niečo ako %1 v .bat, teda prvý parameter z príkazového riadka.
"!start.bat":

Kód: Vybrat vše

@echo off
set vyraz=4/3
for /f "delims=" %%a in ('cscript //nologo karkulka.vbs "%vyraz%"') do set vysledok=%%a
echo %vysledok%
pause
Tu sú ešte nejaké príklady výrazov (reťazce) pre vbs karkulku:

Kód: Vybrat vše

Výraz                    Výsledok
4 / 7 * 2.5              1,42857142857143
Round(Sqr(2),3)          1,414
2^^4                     16 [Potreba dvojitej striešky ^^]
103 Mod 10               3
103 \ 10                 10
Exp(1)                   2,71828182845905
Log(10)                  2,30258509299405
exp(4*log(2))            16
Sin(45*Pi/180)           0,707106781186547
CDbl(Rnd)                0,575344264507294
Int((50-10+1)*Rnd+10)    [Náhodné celé číslo 10...50]
Hex(254)                 FE
Oct(254)                 376
20/4=5                   -1 (t.j. pravda)
Date-1                   Včerajší dátum
Vstup napríklad "1.5", ale výstup je "1,5". Oddeľovač je zrejme podľa nastavenia prostredia Windows.
Zdroj:
http://www.netikka.net/tsneti/info/tscmd061.htm
https://groups.google.com/forum/?fromgr ... JKq2XzQ-Rc

Ten VBS je celkom zaujímavá záležitosť. Poznáte niekto dobrú školu VBS na Internete?


Zpět na “Programování a tvorba webu”

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 2 hosti