2015-04-26 21 views
5

Bir çokgecik komut dosyası oluşturmaya çalışıyorum. Gerçek bir polyglot değil çünkü Shell ya da Batch tarafından "bootstrapped" olmasına rağmen, gerçekte gerçekleştirmek için birden fazla dil gerektiriyor. Bu kısmı sorun yok.Powershell: Bir dosyanın bir bölümünü bir değişkene okuyun

Sorun yaşadığım bölüm, geçerli dosyayı belleğe yükleyebilmeli ve başka bir dilde yazılmış belirli bir bölümü ayıklayabilen, bir değişkenin içinde saklayabilmesi gereken biraz gömülü Powershell kodudur. ve sonunda onu bir tercümana aktar. Dosyanın bölümlerini, diğer dillerden herhangi biriyle çakışmayacak şekilde işaretlemek için kullandığım XML benzeri bir etiketleme sistemim var.

lang_a_code 
# <{LANGB}> 
    ... code in language B ... 
    ... code in language B ... 
    ... code in language B ... 
# <{/LANGB}> 
lang_c_code 

# 'yorumunu belirteçleri, ancak açıklama işaretleri bölümünden diline bağlı olarak farklı şeyler olabilir: belirteçler buna benziyor.

Sahip olduğum sorun, dosyanın yalnızca bu bölümünü ayırmanın bir yolunu bulamıyorum. Tüm dosyayı belleğe yükleyebilirim, ancak etiketler arasındaki şeyleri alamıyorum.

@ECHO OFF 
SETLOCAL EnableDelayedExpansion 

powershell -ExecutionPolicy unrestricted -Command^

    $re = '(?m)^<{LANGB}^>(.*)^<{/LANGB}^>';^ 
    $lang_b_code = ([IO.File]::ReadAllText(^'%0^') -replace $re,'$1');^ 
    echo "${re}";^ 
    echo "Contents: ${lang_b_code}"; 

her şey belirteçleri arasında Contents çıktı yerine sadece kod olmanın tüm dosyasında şu ana kadar sonuç denedim: İşte benim şimdiki kodudur. İşaretleyicilerde kullanılan sembollerden kaçmak için farklı yöntemler denedim, ancak her zaman aynı şeyle sonuçlanır.

NOT: Üst düzey tercüman açılı ayraçlar ve diğer rastgele şeylere kapatırsa Toplu, çünkü ^ kullanılması gereklidir. sadece bir blok olduğundan

+0

kullanın;'? –

+0

Bu, aslında işaretçilerin kendileri haricinde dosyanın tüm içeriğini döndürür. Yani. lang_a # ... dili b ... # lang_c – BHarms

+0

birkaç veya sadece bir blok var mı? Sadece bir tane ise, aynı regex'i kullanabilir, ancak '-match' operatörüyle' -match' sonucunda ayarlanan '$ match [1]' değişkenini kullanarak metne erişebilirsiniz. –

cevap

5

, sen normal ifade

$re = '(?s)^<{LANGB}^>(.*)^^.*^<{/LANGB}^>';^ 

kullanmak ancak -match operatörle ve sonra -match sonucunda ayarlanır $matches[1] değişkeni kullanarak metin erişebilir.

Yani, regex açıklanmasından sonra, '<{LANGB}><{/LANGB}> (ler?) (*.?)' Seçeneğini `$ yeniden = denedin mi

[IO.File]::ReadAllText(^'%0^') -match $re;^ 
echo $matches[1]; 
+0

Yup. Ayrıca, son satırın başlangıcına dahil edilmediğinden emin olmak için bir ^^. * Ekledim: '$ re = '(? S)^<{LANGB}^> (. *) ^^. *^<{/LANGB}^>'^^ – BHarms

+0

Anladım, bu değişikliği ekledim. –

İlgili konular