2013-02-05 8 views
5

Il mio primo post, la maggior parte delle domande già risolte utilizzando questa conoscenza fornita qui. Ma ora sono a corto di idee, di nuovo con una domanda sulla gestione dei caratteri velenosi in cmd.exe.Segnali di percentuale di fuga in determinate variabili

Supponiamo che vi sia una variabile di stringa specificata racchiusa tra virgolette. La maggior parte dei personaggi velenosi è già stata sostituita da caratteri comuni in precedenza, quelli di sinistra che disturbano la sceneggiatura sono "&", "(", ")" e "%". Successivamente la stringa deve essere ripetuta in un file senza virgolette. Così ho avuto l'idea di sfuggire ai personaggi veleno triplicati:

@echo off & setlocal ENABLEEXTENSIONS 
SET AlbumArtist=%1 
CALL :EscapePoisonChars %AlbumArtist% AlbumArtist_VDN 

SET "FlacHyperLink==hyperlink^("file://%AlbumArtist_VDN%"^;"LossLess"^)") 
echo %FlacHyperLink% 
echo %AlbumArtist_VDN% 

endlocal &GOTO:EOF 

:EscapePoisonChars 
@echo off & setlocal ENABLEEXTENSIONS 
SET TmpString=%1 
SET TmpString=%TmpString:&=^^^&% 
SET TmpString=%TmpString:(=^^^(% 
SET TmpString=%TmpString:)=^^^)% 
endlocal&SET %2=%TmpString:~1,-1%&GOTO :EOF 

Quando chiamo il mio script sopra ottengo i risultati attesi - a parte il segno mancante per cento:

G:\YAET\20130204_Work>TryAmper.bat "100% Rock & Roll (7' UpMix)" 
=hyperlink("file://100 Rock & Roll (7' UpMix)";"LossLess") 
100 Rock & Roll (7' UpMix) 

G:\YAET\20130204_Work> 

so che la percentuale può essere sfuggito da solo. Quindi "%%" normalmente porterà a un singolo "%" letterale. Ma non è stato possibile trovare una procedura di sostituzione funzionante per i segni di percentuale perché cmd lo interpreta sempre come variabile e cerca di espanderlo. È questa la direzione sbagliata completa per gestire questo problema o solo fraintendere l'espansione delle variabili? Qualsiasi suggerimento benvenuto! Grazie!

Cheers, Martin

Modifica proprio codice Rimosso, vedi sotto la risposta di Jeb per soluzione pulita.

Grazie per l'aiuto, Martin

risposta

6

Bella domanda!
In un primo momento, sì è possibile sostituire anche i segni di percentuale, ma non all'interno di un'espansione percentuale, qui è necessaria un'espansione ritardata.

Setlocal EnableDelayedExpansion 
set tmpstr=!tmpstr:%=%%! 

Ma se si utilizza l'espansione in ritardo, non è necessario le fughe più, come l'espansione ritardata è l'ultima fase del parser lotto e tutti i personaggi perdono qualsiasi significato speciale.
Hai solo bisogno di echo con espansione ritardata.

Echo !tmpvar! 

EDIT: soluzione Clean

@echo off 
setlocal DisableDelayedExpansion 

REM * More or less secure getting the parameter 
SET "AlbumArtist=%~1" 

setlocal EnableDelayedExpansion 
SET "FlacHyperLink==hyperlink("file://!AlbumArtist!";"LossLess")" 

echo !FlacHyperLink! 
echo !FlacHyperLink!> hugo.txt 

È necessario disableDelayedExpansion prima, per ottenere i marchi anche esclamativi da %1.
Successivamente, è necessario passare all'espansione ritardata e utilizzarla ovunque.

+0

Jeb, speravo che rispondessi dopo aver visto [link] (http://ss64.org/viewtopic.php?pid=4919#p4919) con il tuo incredibile trucco che ancora non capisco completamente. Finalmente il tuo suggerimento sopra ha risolto il mio problema con i personaggi velenosi. Ho aggiunto uno snippet di codice breve basato sulla tua soluzione alla mia domanda perché voglio usare il formato del blocco di codice. Molte grazie! Martin – CmdQuestion

+0

Aarrg - che diavolo hai fatto? Ho aggiunto una soluzione _clean_ – jeb

+0

Jeb, scusa se non sei soddisfatto del mio lavoro. Usando il codice non ho riscontrato problemi per nessuna combinazione di caratteri, quindi ho pensato che sarebbe stato abbastanza bello presentare il risultato qui. L'ho saltato e mi sono riferito alla tua soluzione ora. Martin – CmdQuestion