SORU
14 HAZİRAN 2011, Salı


Powershell, nasıl bir dizeden keyfi yerel bir komut çalıştırmak mı?

Aşağıdaki senaryo ile benim ifade edebilirim:Yerel bir komut olarak çalıştırmak için bir dize kabul eden bir fonksiyon yazın.

Eğer verbatim çalıştırmak için bir komut ile tedarik şirket başka bir yerden komut satırı diğer kamu hizmetleri ile arabirim. bir fikrin ihtimal çok uzak değil: Komuta kontrol edemezsin çünkügiriş olarak herhangi bir geçerli komut kabul. Bu kolayca üstesinden yapamaz oldum ana hıçkırık

  1. Bu komut, bir program içinde bir boşluk: bir yol içinde yaşayan yürütebilir

    $command = '"C:\Program Files\TheProg\Runit.exe" Hello';
    
  2. Komut onlara boşluk ile parametreleri olabilir:

    $command = 'echo "hello world!"';
    
  3. Komutu tek ve çift kene olabilir:

    $command = "echo `"it`'s`"";
    

Yokherhangi birbunu sağlamanın yolu temiz mi? Sadece cömert ve çirkin çözümler üretirler başaramadım, ama betik dili için bu ölü basit olmalı diye düşünüyorum.

CEVAP
14 HAZİRAN 2011, Salı


Invoke-Expression de iex gibi kenarları yumuşatılmış. Aşağıdaki örnekler üzerinde #2 ve 3 çalışır:

iex $command

Bazı dizeleri exe tırnak içinde olduğu için olduğu gibi, örnek olarak #1 kazandı. Bu gibi çalışır, düz Powershell bir komut çalıştırmak mı istiyorsunuz tam dize içeriğini çünkü istem:

$command = 'C:\somepath\someexe.exe somearg'
iex $command

Eğer exe tırnak içinde ise, komut satırında çalıştırmak gibi & yardımı çalışan, bu örnekte olduğu gibi almak gerekir:

>> &"C:\Program Files\Some Product\SomeExe.exe" "C:\some other path\file.ext"

Ve daha sonra komut:

$command = '"C:\Program Files\Some Product\SomeExe.exe" "C:\some other path\file.ext"'
iex "& $command"

Büyük olasılıkla, eğer komut dizenin ilk karakteri " Bu naif uygulaması gibi algılayarak hemen hemen tüm vakalar ele verebilir:

function myeval($command) {
    if ($command[0] -eq '"') { iex "& $command" }
    else { iex $command }
}

Ama farklı bir şekilde çağrılacak olan diğer bazı durumlarda bulabilirsiniz. Bu durumda try{}catch{}, belki de belirli bir istisna türleri için/mesajlar kullanın veya komut dize incelemek gerekir.

Eğer her zaman tam yolu yerine göreli yolları alırsanız, çok özel durumlarda bunu yapmamalıydın varsa 2 yukarıdaki dışında.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BurnedInDotCom

    BurnedInDotC

    3 NİSAN 2010
  • Alexey - servant of Christ

    Alexey - ser

    15 EYLÜL 2007
  • Pál Zoltán Illés

    Pál Zoltán

    30 NİSAN 2007