SORU
19 Kasım 2010, Cuma


Nasıl Çağırmak Komut ile parametreler adlı geçtim mi?

Uzaktan Çağırma Komutu ile çalıştırabilirsiniz bir senaryo var

Invoke-Command -ComputerName (Get-Content C:\Scripts\Servers.txt) -FilePath C:\Scripts\ArchiveEventLogs\ver5\ArchiveEventLogs.ps1

Varsayılan parametreleri kullandığım sürece gayet iyi çalışıyor. Ancak, komut dosyası, 2 atadı [geçiş] parametreleri (hata Ayıklama ve Net)

Nasıl Çağırmak Komut ile çekmiş parametreleri geçebilir miyim? Denedim -ArgumentList ama sözdizimi yanlış olmalı o yüzden hata alıyorum. Herhangi bir yardım büyük beğeni topluyor.

CEVAP
19 Kasım 2010, Cuma


-ArgumentList kullanımına dayalıscriptblockgibi komutlar:

Invoke-Command -Cn (gc Servers.txt) {param($Debug=$False, $Clear=$False) C:\Scripts\ArchiveEventLogs\ver5\ArchiveEventLogs.ps1 } -ArgumentList $False,$True

-File ile aradığınızda, hala aptal splatted bir dizi gibi parametreleri geçirir. Bu komut için eklenen feature request (lütfen oy) teslim ettim.

Yani, iki seçeneğiniz vardır:

Eğer bir komut dosyası gibi görünüyor bu, bir ağ konumu erişilebilen uzak makine (not -Debug ima çünkü kullandığım Parameter öznitelik, senaryoyu alır CmdletBinding örtülü olarak, ve böylece, tüm ortak parametreler):

param(
   [Parameter(Position=0)]
   $one
,
   [Parameter(Position=1)]
   $two
,
   [Parameter()]
   [Switch]$Clear
)

"The test is for '$one' and '$two' ... and we $(if($DebugPreference -ne 'SilentlyContinue'){"will"}else{"won't"}) run in debug mode, and we $(if($Clear){"will"}else{"won't"}) clear the logs after."

Eğer çağırmak istersen 14 * ... * anlamı kapattı almadan Invoke-Command aşağıdaki sözdizimi birini kullanabilirsiniz:

icm -cn (gc Servers.txt) { 
    param($one,$two,$Debug=$False,$Clear=$False)
    C:\Scripts\ArchiveEventLogs\ver5\ArchiveEventLogs.ps1 @PSBoundParameters
} -ArgumentList "uno", "dos", $false, $true

O, bu umurumda TÜM bu parametreleri çoğaltmak ediyorumscriptblockdeğerleri iletebilir. Ben sabit kod onlara yaptığım şeydir) tek ve sadece lazım olanları geçebilir PSBoundParameters, kullanmaya gerek yok. $Apaçık bir pas geçiyorum aşağıdaki ikinci örnekte, sadece geçmek için nasıl göstermek için parametreleri anahtarı:

icm -cn $Env:ComputerName { 
    param([bool]$Clear)
    C:\Scripts\ArchiveEventLogs\ver5\ArchiveEventLogs.ps1 "uno" "dos" -Debug -Clear:$Clear
} -ArgumentList $(Test-Path $Profile)

Diğer bir seçenek

Eğer script üzerinde yerel makine ve değiştirmek istemediğinde parametreleri için konum, ya da istediğiniz belirtmek için parametreleri ortak parametreleri (yani kontrol edemezsin onları) sen-ecek almak ister içerik, komut ve embed bu seninscriptblock:

$script = [scriptblock]::create( @"
param(`$one,`$two,`$Debug=`$False,`$Clear=`$False)
&{ $(Get-Content C:\Scripts\ArchiveEventLogs\ver5\ArchiveEventLogs.ps1 -delimiter ([char]0)) } @PSBoundParameters
"@ )

Invoke-Command -Script $script -Args "uno", "dos", $false, $true

PostScript:

Eğer gerçekten kod adı için bir değişken geçmek gerekirse, ne yapacağını değişkeni yerel olarak veya uzaktan tanımlı olup olmadığına bağlıdır. Genel olarak, eğer bir değişken $Script veya bir ortam değişkeni $Env:Script adı ile bir komut dosyası, çalıştırmak ile çağrı operatörü (&): &$Script &$Env:Script

Eğer zaten uzak bilgisayarda tanımlanan bir ortam değişkeni varsa, yapacak başka bir şey yok. Bir sakıncası yoksayereldeğişken, uzak komut dosyası bloğu için onu geçmek zorundasın:

Invoke-Command -cn $Env:ComputerName { 
    param([String]$Script, [bool]$Clear)
    &$Script "uno" "dos" -Debug -Clear:$Clear
} -ArgumentList $ScriptPath, $(Test-Path $Profile)

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ASUS North America

    ASUS North A

    12 AĞUSTOS 2008
  • Jabari Johnson

    Jabari Johns

    18 Ocak 2008
  • RinconDynamic

    RinconDynami

    1 EKİM 2011