Как передать аргумент параметра из параметра ps.1 в функцию с таким же именем? - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть диагностический сценарий PowerShell, который я хочу, чтобы администраторы сервера использовали со следующими потоками пользователей:

  • Sysadmin вставляет сценарий в окно RDP / Remote Desktop.Он выполняется немедленно
  • Сисадмин запускает сценарий из командной строки, предполагая, что политика сценариев позволяет ему

Я также хочу, чтобы диагностический параметр запускался в следующих случаях:

  • Системный администратор запускает функцию с параметром (-debug)
  • Системный администратор запускает скрипт с функцией

Это упрощенный пример

Inspect-ProductionHost.ps1

function Inspect-ProductionHost()
{ 
    param ([switch]$DoDebug)

    if($DoDebug -eq $True)
    {
        Get-DebugData 
        Write-output $DebugData
    }

    write-output "Testing Server"
    TestHost-Configuration1
}

cls #clear the output incase this is pasted in. Simplify diagnostics
Inspect-ProductionHost($DoDebug)

Проблема заключается в том, что при выполнении этого из командной строки .\Inspect-ProductionHost -DoDebug параметр не передается в функцию.

Альтернативное объяснение

И я хотел бы запустить скрипт следующими способами:

  1. Вставить код в RDP Inspect-ProductionHost, и он будет работать без $DebugData
  2. После вставки введите Inspect-ProductionHost -DoDebug

- ИЛИ -

Запустить скрипт из командной строки .\Inspect-ProductionHost Запустить скрипт из командной строки .\Inspect-ProductionHost -DoDebug

Это возможно в Powershell?

1 Ответ

0 голосов
/ 04 декабря 2018

Это ...

Inspect-ProductionHost ($ DoDebug)

... это не то, как вы используете переключатель.Позже у вас появится опция.

. \ Inspect-ProductionHost -DoDebug

Кроме того, для коммутатора они так, как вы его используете, это ...

if ($ DoDebug -eq $ True)

... на самом деле не требуется.Это может быть просто так ...

if ($ DoDebug)

Что касается этого ... "• Системный администратор вставляет скрипт в окно RDP / Remote Desktop. Он выполняется немедленно"

Если это не будет вставлено в экземпляр PowerShell ConsoleHost, который должен быть запущен после входа в цель RDP, то нет, этого не произойдет.

Этим усилием вы просто вставляете необработанный код в ConsoleHost и запускаете его при нажатии клавиши ввода.Вставка кода, не запускает код.Интерактивное клавиатурное действие все еще требуется.

Вы действительно должны скопировать сценарий в расположение RDP и попросить администраторов запустить его с хоста PowerShell, вместо этой операции вставки копии.Таким образом, вы можете получить запуск или без переключателя отладки, который вы пытаетесь использовать.

В этом усилии копирования и вставки, которое все еще требует интерактивного шага, для того, чтобы произошла отладка, вы должны сделать этоОбязательный параметр с логическим параметром.

Итак, это ваш второй параметр

3. Запустите скрипт из командной строки. \ Inspect-ProductionHost 4. Запустите скрипт из командной строки. \ Inspect-ProductionHost -DoDebug

... это самый разумный способ сделать это.

Более простой способ, если только у вас не запущен консольный хост PowerShell, автоматически запускающийся при входе в цель RDP, он должен бытьзапускается вручную, и код запускается вручную.

Другой вариант - скопировать сценарий в цель RDP, использовать сценарий входа в систему, чтобы запустить его, и запросить сценарий для запуска отладки, этот логический ответ.

function Inspect-ProductionHost()
{ 
    param ([switch]$DoDebug)

    if($DoDebug -eq $True)
    {
        Get-DebugData 
        Write-output $DebugData
    }

    write-output "Testing Server"
    Test-Connection -ComputerName $env:COMPUTERNAME
}

Inspect-ProductionHost
Testing Server

Source        Destination     IPV4Address      IPV6Address                              Bytes    Time(ms) 
------        -----------     -----------      -----------                              -----    -------- 
WS01          WS01            10.0.0....       fe80::b812:f23d:94b3:33e9%4              32       0        
WS01          WS01            10.0.0....       fe80::b812:f23d:94b3:33e9%4              32       0        
WS01          WS01            10.0.0....       fe80::b812:f23d:94b3:33e9%4              32       0        
WS01          WS01            10.0.0....       fe80::b812:f23d:94b3:33e9%4              32       0        



Inspect-ProductionHost($DoDebug)
Testing Server

Source        Destination     IPV4Address      IPV6Address                              Bytes    Time(ms) 
------        -----------     -----------      -----------                              -----    -------- 
WS01          WS01            10.0.0....       fe80::b812:f23d:94b3:33e9%4              32       0        
WS01          WS01            10.0.0....       fe80::b812:f23d:94b3:33e9%4              32       0        
WS01          WS01            10.0.0....       fe80::b812:f23d:94b3:33e9%4              32       0        
WS01          WS01            10.0.0....       fe80::b812:f23d:94b3:33e9%4              32       0        



Inspect-ProductionHost -DoDebug
Get-DebugData : The term 'Get-DebugData' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or 
if a path was included, verify that the path is correct and try again.
At line:7 char:9
+         Get-DebugData
+         ~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (Get-DebugData:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

Testing Server

Source        Destination     IPV4Address      IPV6Address                              Bytes    Time(ms) 
------        -----------     -----------      -----------                              -----    -------- 
WS01          WS01            10.0.0....       fe80::b812:f23d:94b3:33e9%4              32       0        
WS01          WS01            10.0.0....       fe80::b812:f23d:94b3:33e9%4              32       0        
WS01          WS01            10.0.0....       fe80::b812:f23d:94b3:33e9%4              32       0        
WS01          WS01            10.0.0....       fe80::b812:f23d:94b3:33e9%4              32       0        








function Inspect-ProductionHost()
{ 
    param ([switch]$DoDebug)

    if($DoDebug)
    {
        Get-DebugData 
        Write-output $DebugData
    }

    write-output "Testing Server"
    Test-Connection -ComputerName $env:COMPUTERNAME
}

Inspect-ProductionHost
Testing Server

Source        Destination     IPV4Address      IPV6Address                              Bytes    Time(ms) 
------        -----------     -----------      -----------                              -----    -------- 
WS01          WS01            10.0.0....       fe80::b812:f23d:94b3:33e9%4              32       0        
WS01          WS01            10.0.0....       fe80::b812:f23d:94b3:33e9%4              32       0        
WS01          WS01            10.0.0....       fe80::b812:f23d:94b3:33e9%4              32       0        
WS01          WS01            10.0.0....       fe80::b812:f23d:94b3:33e9%4              32       0        



Inspect-ProductionHost($DoDebug)
Testing Server

Source        Destination     IPV4Address      IPV6Address                              Bytes    Time(ms) 
------        -----------     -----------      -----------                              -----    -------- 
WS01          WS01            10.0.0....       fe80::b812:f23d:94b3:33e9%4              32       0        
WS01          WS01            10.0.0....       fe80::b812:f23d:94b3:33e9%4              32       0        
WS01          WS01            10.0.0....       fe80::b812:f23d:94b3:33e9%4              32       0        
WS01          WS01            10.0.0....       fe80::b812:f23d:94b3:33e9%4              32       0        



Inspect-ProductionHost -DoDebug
Get-DebugData : The term 'Get-DebugData' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or 
if a path was included, verify that the path is correct and try again.
At line:7 char:5
+     Get-DebugData
+     ~~~~~~~~~~~~~
+ CategoryInfo          : ObjectNotFound: (Get-DebugData:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException

Testing Server

Source        Destination     IPV4Address      IPV6Address                              Bytes    Time(ms) 
------        -----------     -----------      -----------                              -----    -------- 
WS01          WS01            10.0.0....       fe80::b812:f23d:94b3:33e9%4              32       0        
WS01          WS01            10.0.0....       fe80::b812:f23d:94b3:33e9%4              32       0        
WS01          WS01            10.0.0....       fe80::b812:f23d:94b3:33e9%4              32       0        
WS01          WS01            10.0.0....       fe80::b812:f23d:94b3:33e9%4              32       0        

Если вы действительно хотите сделать эту операцию копирования-вставки, что опять-таки просто странная вещь, то это не обязательно должно бытьфункция.Просто скопируйте и вставьте приведенное ниже в консоль таким образом.

param 
(
    [Parameter(Mandatory=$true)]
    [ValidateSet('True','False')] 
    [string]$DoDebug
)

if($DoDebug -eq 'True')
{
    Get-DebugData 
    Write-output $DebugData
}

write-output "Testing Server"
Test-Connection -ComputerName $env:COMPUTERNAME
cmdlet  at command pipeline position 1
Supply values for the following parameters:
DoDebug: false
Testing Server

Source        Destination     IPV4Address      IPV6Address                              Bytes    Time(ms) 
------        -----------     -----------      -----------                              -----    -------- 
WS01          WS01            10.0.0...       fe80::b812:f23d:94b3:33e9%4              32       0        
WS01          WS01            10.0.0...       fe80::b812:f23d:94b3:33e9%4              32       0        
WS01          WS01            10.0.0...       fe80::b812:f23d:94b3:33e9%4              32       0        
WS01          WS01            10.0.0...       fe80::b812:f23d:94b3:33e9%4              32       0        



param 
(
    [Parameter(Mandatory=$true)]
    [ValidateSet('True','False')] 
    [string]$DoDebug
)

if($DoDebug -eq 'True')
{
    Get-DebugData 
    Write-output $DebugData
}

write-output "Testing Server"
Test-Connection -ComputerName $env:COMPUTERNAME
cmdlet  at command pipeline position 1
Supply values for the following parameters:
DoDebug: true
Get-DebugData : The term 'Get-DebugData' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or 
if a path was included, verify that the path is correct and try again.
At line:10 char:5
+     Get-DebugData
+     ~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (Get-DebugData:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

Testing Server

Source        Destination     IPV4Address      IPV6Address                              Bytes    Time(ms) 
------        -----------     -----------      -----------                              -----    -------- 
WS01          WS01            10.0.0...       fe80::b812:f23d:94b3:33e9%4              32       0        
WS01          WS01            10.0.0...       fe80::b812:f23d:94b3:33e9%4              32       0        
WS01          WS01            10.0.0...       fe80::b812:f23d:94b3:33e9%4              32       0        
WS01          WS01            10.0.0...       fe80::b812:f23d:94b3:33e9%4              32       0        
...