Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Výměna určitého textu v souboru za název souboru (kontext.menu)

Ahoj chlapi, obracím se zase s problémem, který sám nedokážu vyřešit.
Potřebuju v označených souborech změnit určitý text(s tím si poradím pomocí reg.exp)
za text, který je názvem tohoto souboru bez přípony. Dal by se využít parametr vracející
pouze název souboru %~nX u příkazu FOR, jenže už netuším, jak ho zakomponovat do celého příkazu.
Tokens a delims jsou pro mne španělská vesnice :-) Příkaz sed už tak nějak díky Losovi a Taouchwoodovi zvládám, ale zase
v něm nemůžu použít %~nX.

Struktura souborů je následující:

0 BEGIN PGM 11_002 MM
.další řádky programu
.
.
179978 END PGM 11_002 MM

Potřebuji vybrat text mezi PGM a MM (v tomto případě 11_002) a nahradit ho názvem souboru bez přípony.
Jedná se vždy o první a poslední řádek, je to program pro CNC.

A aby toho nebylo málo, tak bych chtěl příkaz zakomponovat do kontextového menu, prostě provádět operaci jen s určitými soubory.
Ve WXP, tak W7_64bit vím, kam a co vložit za klíče, jen prostě netuším jak zapsat to hlavní, příkaz). Pokud by to nebylo na jeden řádek,
volal bych bat externě s parametrem, to by taky nevadilo.

Ještě otázka, příkaz vyvolaný z registru se chová jako spuštěný z příkaz.řádku nebo jako z bat,cmd? Kvůli zápisu proměnných % nebo %%

Díky za případné pošťouchnutí, radu, jakým směrem se vydat... :-)

Předmět Autor Datum
pro odeslání opravovaného souboru pravým myšem přes 'sendto' do zástupce batky. nepředpokládám název…
lední brtník 22.03.2014 05:51
lední brtník
Díky, použil jsem SET a vyřešil jsem to prozatím takto a funguje to: cnc.bat set fname=%~n1 sed -i…
greyhound 22.03.2014 20:43
greyhound
sed -ir 's/(.*)/\U\1/g' $fname a len tak na okraj: chodí Ti tá batka s viacerými vybranými súbormi?
pme 22.03.2014 21:19
pme
Díky, ale tahle kombinace mi nefunguje. Používám GNU sed v 4.0.7 Po úpravě na sed -ir "s/(.*)/\U\1/… poslední
greyhound 22.03.2014 22:06
greyhound

pro odeslání opravovaného souboru pravým myšem přes 'sendto' do zástupce batky. nepředpokládám název souboru s mezerou:

@echo off
 REM v.1 # zastupce batky do %APPDATA%\Microsoft\Windows\SendTo
 set fname=%~n1
 set file=%~nx1
 REM nove umisteni upravenych souboru
 set new=\new
:TEST
 if "%1"=="" echo batka spustena primo, bez parametru "file - sendto" && goto END
:NULTY
 echo 0 BEGIN PGM %fname% MM>%new%\%file%
:BEZ_ZMENY
 type %file% | find /v "PGM " >>%new%\%file%
:POSLEDNI
 for /f "tokens=1 delims= " %%n in ('type %file% ^| find "PGM "') do (set num=%%n)
 echo %num% END PGM %fname% MM>%new%\%file%
:POROVNAT
 fc /n %file% %new%\%file%
:END
 pause

Díky, použil jsem SET a vyřešil jsem to prozatím takto a funguje to:

cnc.bat

set fname=%~n1
sed -i "s/PGM .*[ˆ ]MM/PGM %fname% MM/g" %1

a do registrů přidal toto:

[HKEY_CLASSES_ROOT\hnc_auto_file\shell\Změna názvu PGM\command]
@="cnc.bat %1"

zkusil jsem tohle celé nacpat do REG_SZ abych nemuset volat batku, ale asi tomu budou vadit uvozovky. Nefunguje ani bez uvozovek.

cmd /C "set fname=%~n1 & sed -i "s/PGM .*[ˆ ]MM/PGM %fname% MM/g" %1 "

Trápí mě ještě jedna a to zásadní věc, bez které je mi tohle celé nanic. Potřebuju obsah proměnné fname převést na velká písmena.
Zkusil jsem zase použít sed, jenže se příkaz zasekne a nepokračuje, ani chyb.hláška

sed "s/\(%fname%\)/\U\1/"

Poradí někdo, jak na změnu? Díky

Díky, ale tahle kombinace mi nefunguje. Používám GNU sed v 4.0.7
Po úpravě na

sed -ir "s/(.*)/\U\1/g" $fname

vyběhne chybová hláška:
sed: -e expression #1, char 13: Invalid reference \1 on `s' command's RHS, proto jsem přidal zpětná lomítka. Po úpravě na

sed -ir "s/\(.*\)/\U\1/g" $fname

chyba: sed: can't read $fname: No such file or directory. Nejspíš pracuje jen se soubory

Teď na výstup koukám... s více soubory to přes SendTo nejde, batka vezme jen první.

Přes registry (vyvolání batky) vezme všechny, jen vyběhne na moment spousta oken, což by nevadilo.
Našel jsem možnost na změnu velikosti, jen je to trochu krkolomné :-) :

cnc.bat

set fname=%~n1
@echo off & setlocal enableextensions
call :ToUpcase "%fname%" fname
sed -i "s/PGM .*[ˆ ]MM/PGM %fname% MM/g" %1

  endlocal & goto :EOF
  :ToUpcase
  setlocal enableextensions
    set var_=%1
    set var_=%var_:a=A%
    set var_=%var_:b=B%
    set var_=%var_:c=C%
    set var_=%var_:d=D%
    set var_=%var_:e=E%
    set var_=%var_:f=F%
    set var_=%var_:g=G%
    set var_=%var_:h=H%
    set var_=%var_:i=I%
    set var_=%var_:j=J%
    set var_=%var_:k=K%
    set var_=%var_:l=L%
    set var_=%var_:m=M%
    set var_=%var_:n=N%
    set var_=%var_:o=O%
    set var_=%var_:p=P%
    set var_=%var_:q=Q%
    set var_=%var_:r=R%
    set var_=%var_:s=S%
    set var_=%var_:t=T%
    set var_=%var_:u=U%
    set var_=%var_:v=V%
    set var_=%var_:w=W%
    set var_=%var_:x=X%
    set var_=%var_:y=Y%
    set var_=%var_:z=Z%
  endlocal & set %2=%var_%& goto :EOF

Ještě to musím otestovat s více kombinacemi názvů

Zpět do poradny Odpovědět na původní otázku Nahoru