about_Scripts

Descripción breve

Describe cómo ejecutar y escribir scripts en PowerShell.

Descripción larga

Un script es un archivo de texto sin formato que contiene uno o varios comandos de PowerShell. Los scripts de PowerShell tienen una .ps1 extensión de archivo.

Ejecutar un script es muy parecido a ejecutar un cmdlet. Escriba la ruta de acceso y el nombre de archivo del script y use parámetros para enviar datos y establecer opciones. Puede ejecutar scripts en el equipo o en una sesión remota en otro equipo.

Escribir un script guarda un comando para su uso posterior y facilita el uso compartido con otros usuarios. Lo más importante es que le permite ejecutar los comandos simplemente escribiendo la ruta de acceso del script y el nombre de archivo. Los scripts pueden ser tan simples como un solo comando en un archivo o tan extenso como un programa complejo.

Los scripts tienen características adicionales, como el #Requires comentario especial, el uso de parámetros, compatibilidad con secciones de datos y firma digital para la seguridad. También puede escribir temas de Ayuda para scripts y para cualquier función del script.

Ejecución de un script

Para poder ejecutar un script en Windows, debe cambiar la directiva de ejecución predeterminada de PowerShell. La directiva de ejecución no se aplica a PowerShell que se ejecuta en plataformas que no son de Windows.

La directiva de ejecución predeterminada, Restricted, impide que todos los scripts se ejecuten, incluidos los scripts que se escriben en el equipo local. Para obtener más información, vea about_Execution_Policies.

La directiva de ejecución se guarda en el Registro, por lo que debe cambiarla solo una vez en cada equipo.

Para cambiar la directiva de ejecución, use el procedimiento siguiente.

En el símbolo del sistema, escriba:

Set-ExecutionPolicy AllSigned

o

Set-ExecutionPolicy RemoteSigned

El cambio entra en vigor inmediatamente.

Para ejecutar un script, escriba el nombre completo y la ruta de acceso completa al archivo de script.

Por ejemplo, para ejecutar el script Get-ServiceLog.ps1 en el directorio C:\Scripts, escriba esto:

C:\Scripts\Get-ServiceLog.ps1

Para ejecutar un script en el directorio actual, escriba la ruta de acceso al directorio actual o use un punto para representar el directorio actual, seguido de una barra diagonal inversa de ruta de acceso (.\).

Por ejemplo, para ejecutar el script ServicesLog.ps1 en el directorio local, escriba:

.\Get-ServiceLog.ps1

Si el script tiene parámetros, escriba los parámetros y los valores de parámetro después del nombre de archivo del script.

Por ejemplo, el comando siguiente usa el parámetro ServiceName del script Get-ServiceLog para solicitar un registro de la actividad del servicio WinRM.

.\Get-ServiceLog.ps1 -ServiceName WinRM

Como característica de seguridad, PowerShell no ejecuta scripts al hacer doble clic en el icono de script en Explorador de archivos o al escribir el nombre del script sin una ruta de acceso completa, incluso cuando el script está en el directorio actual. Para obtener más información sobre la ejecución de comandos y scripts en PowerShell, consulte about_Command_Precedence.

Ejecutar con PowerShell

A partir de PowerShell 3.0, puede ejecutar scripts desde Explorador de archivos.

Para usar la característica "Ejecutar con PowerShell":

Ejecute Explorador de archivos, haga clic con el botón derecho en el nombre de archivo del script y seleccione "Ejecutar con PowerShell".

La característica "Ejecutar con PowerShell" está diseñada para ejecutar scripts que no tienen parámetros necesarios y no devuelven la salida al símbolo del sistema.

Para más información, consulte about_Run_With_PowerShell.

Ejecución de scripts en otros equipos

Para ejecutar un script en uno o varios equipos remotos, use el parámetro FilePath del Invoke-Command cmdlet .

Escriba la ruta de acceso y el nombre de archivo del script como valor del parámetro FilePath . El script debe encontrarse en el equipo local o en un directorio al que el equipo local pueda acceder.

El siguiente comando ejecuta el Get-ServiceLog.ps1 script en los equipos remotos denominados Server01 y Server02.

Invoke-Command -ComputerName Server01,Server02 -FilePath `
  C:\Scripts\Get-ServiceLog.ps1

Obtención de ayuda para scripts

El cmdlet Get-Help obtiene los temas de ayuda para scripts, así como para cmdlets y otros tipos de comandos. Para obtener el tema de ayuda de un script, escriba Get-Help seguido de la ruta de acceso y el nombre de archivo del script. Si la ruta de acceso del script está en Path la variable de entorno, puede omitir la ruta de acceso.

Por ejemplo, para obtener ayuda para el script ServicesLog.ps1, escriba:

get-help C:\admin\scripts\ServicesLog.ps1

Cómo escribir un script

Un script puede contener cualquier comando válido de PowerShell, incluidos comandos únicos, comandos que usan la canalización, las funciones y las estructuras de control, como instrucciones If y bucles For.

Para escribir un script, abra un nuevo archivo en un editor de texto, escriba los comandos y guárdelos en un archivo con un nombre de archivo válido con la extensión de .ps1 archivo.

El ejemplo siguiente es un script sencillo que obtiene los servicios que se ejecutan en el sistema actual y los guarda en un archivo de registro. El nombre de archivo de registro se crea a partir de la fecha actual.

$date = (get-date).dayofyear
get-service | out-file "$date.log"

Para crear este script, abra un editor de texto o un editor de scripts, escriba estos comandos y guárdelos en un archivo denominado ServiceLog.ps1.

Parámetros en scripts

Para definir parámetros en un script, use una instrucción Param. La Param instrucción debe ser la primera instrucción de un script, excepto los comentarios y las #Require instrucciones.

Los parámetros de script funcionan como parámetros de función. Los valores de parámetro están disponibles para todos los comandos del script. Todas las características de los parámetros de función, incluido el atributo Parameter y sus argumentos con nombre, también son válidas en scripts.

Al ejecutar el script, los usuarios escriben los parámetros después del nombre del script.

En el ejemplo siguiente se muestra un Test-Remote.ps1 script que tiene un parámetro ComputerName . Ambas funciones de script pueden tener acceso al valor del parámetro ComputerName .

param ($ComputerName = $(throw "ComputerName parameter is required."))

function CanPing {
   $error.clear()
   $tmp = test-connection $computername -erroraction SilentlyContinue

   if (!$?)
       {write-host "Ping failed: $ComputerName."; return $false}
   else
       {write-host "Ping succeeded: $ComputerName"; return $true}
}

function CanRemote {
    $s = new-pssession $computername -erroraction SilentlyContinue

    if ($s -is [System.Management.Automation.Runspaces.PSSession])
        {write-host "Remote test succeeded: $ComputerName."}
    else
        {write-host "Remote test failed: $ComputerName."}
}

if (CanPing $computername) {CanRemote $computername}

Para ejecutar este script, escriba el nombre del parámetro después del nombre del script. Por ejemplo:

C:\PS> .\test-remote.ps1 -computername Server01

Ping succeeded: Server01
Remote test failed: Server01

Para obtener más información sobre la instrucción Param y los parámetros de función, consulte about_Functions y about_Functions_Advanced_Parameters.

Escribir ayuda para scripts

Puede escribir un tema de ayuda para un script mediante cualquiera de los dos métodos siguientes:

  • Ayuda basada en comentarios para scripts

    Cree un tema de Ayuda mediante palabras clave especiales en los comentarios. Para crear ayuda basada en comentarios para un script, los comentarios deben colocarse al principio o al final del archivo de script. Para obtener más información sobre la Ayuda basada en comentarios, consulte about_Comment_Based_Help.

  • Ayuda basada en XML para scripts

    Cree un tema de Ayuda basado en XML, como el tipo que normalmente se crea para cmdlets. La Ayuda basada en XML es necesaria si va a traducir temas de Ayuda a varios idiomas.

Para asociar el script al tema de ayuda basado en XML, use . Palabra clave de comentario de ExternalHelp Help. Para obtener más información sobre la palabra clave ExternalHelp, consulte about_Comment_Based_Help. Para obtener más información sobre la ayuda basada en XML, vea Cómo escribir ayuda de cmdlets.

Devolver un valor de salida

De forma predeterminada, los scripts no devuelven un estado de salida cuando finaliza el script. Debe usar la exit instrucción para devolver un código de salida de un script. De forma predeterminada, la exit instrucción devuelve 0. Puede proporcionar un valor numérico para devolver un estado de salida diferente. Normalmente, un código de salida distinto de cero indica un error.

En Windows, se permite cualquier número entre [int]::MinValue y [int]::MaxValue .

En Unix, solo se permiten números positivos entre [byte]::MinValue (0) y [byte]::MaxValue (255). Un número negativo en el intervalo de -1 a través -255 se traduce automáticamente en un número positivo agregando 256. Por ejemplo, -2 se transforma en 254.

En PowerShell, la exit instrucción establece el valor de la $LASTEXITCODE variable. En el Shell de comandos de Windows (cmd.exe), la instrucción exit establece el valor de la %ERRORLEVEL% variable de entorno.

Cualquier argumento que no sea numérico o fuera del intervalo específico de la plataforma se traduce al valor de 0.

Ámbito de script y origen de puntos

Cada script se ejecuta en su propio ámbito. Las funciones, variables, alias y unidades que se crean en el script solo existen en el ámbito del script. No puede acceder a estos elementos ni a sus valores en el ámbito en el que se ejecuta el script.

Para ejecutar un script en un ámbito diferente, puede especificar un ámbito, como Global o Local, o bien puede generar puntos en el script.

La característica dot sourcing permite ejecutar un script en el ámbito actual en lugar de en el ámbito de script. Al ejecutar un script con origen de puntos, los comandos del script se ejecutan como si hubiera escritolos en el símbolo del sistema. Las funciones, variables, alias y unidades que crea el script se crean en el ámbito en el que está trabajando. Una vez que se ejecute el script, puede usar los elementos creados y acceder a sus valores en la sesión.

Para puntear un script, escriba un punto (.) y un espacio antes de la ruta de acceso del script.

Por ejemplo:

. C:\scripts\UtilityFunctions.ps1

o

. .\UtilityFunctions.ps1

Una vez que se ejecuta el UtilityFunctions.ps1 script, las funciones y variables que crea el script se agregan al ámbito actual.

Por ejemplo, el UtilityFunctions.ps1 script crea la New-Profile función y la $ProfileName variable .

#In UtilityFunctions.ps1

function New-Profile
{
  Write-Host "Running New-Profile function"
  $profileName = split-path $profile -leaf

  if (test-path $profile)
    {write-error "Profile $profileName already exists on this computer."}
  else
    {new-item -type file -path $profile -force }
}

Si ejecuta el UtilityFunctions.ps1 script en su propio ámbito de script, la New-Profile función y la $ProfileName variable solo existen mientras se ejecuta el script. Cuando se cierra el script, se quitan la función y la variable, como se muestra en el ejemplo siguiente.

C:\PS> .\UtilityFunctions.ps1

C:\PS> New-Profile
The term 'new-profile' is not recognized as a cmdlet, function, operable
program, or script file. Verify the term and try again.
At line:1 char:12
+ new-profile <<<<
   + CategoryInfo          : ObjectNotFound: (new-profile:String) [],
   + FullyQualifiedErrorId : CommandNotFoundException

C:\PS> $profileName
C:\PS>

Al generar el script y ejecutarlo, el script crea la New-Profile función y la variable en la $ProfileName sesión en el ámbito. Una vez que se ejecute el script, puede usar la New-Profile función en la sesión, como se muestra en el ejemplo siguiente.

C:\PS> . .\UtilityFunctions.ps1

C:\PS> New-Profile

    Directory: C:\Users\juneb\Documents\WindowsPowerShell

    Mode    LastWriteTime     Length Name
    ----    -------------     ------ ----
    -a---   1/14/2009 3:08 PM      0 Microsoft.PowerShellISE_profile.ps1

C:\PS> $profileName
Microsoft.PowerShellISE_profile.ps1

Para obtener más información sobre el ámbito, consulte about_Scopes.

Scripts en módulos

Un módulo es un conjunto de recursos de PowerShell relacionados que se pueden distribuir como una unidad. Puede usar módulos para organizar los scripts, funciones y otros recursos. También puede usar módulos para distribuir el código a otros usuarios y obtener código de orígenes de confianza.

Puede incluir scripts en los módulos o puede crear un módulo de script, que es un módulo que consta completamente o principalmente de un script y recursos auxiliares. Un módulo de script es simplemente un script con una extensión de archivo .psm1.

Para obtener más información sobre los módulos, consulte about_Modules.

Otras características de script

PowerShell tiene muchas características útiles que puede usar en scripts.

  • #Requires - Puede usar una #Requires instrucción para evitar que un script se ejecute sin módulos o complementos especificados y una versión especificada de PowerShell. Para obtener más información, consulte about_Requires.

  • $PSCommandPath : contiene la ruta de acceso completa y el nombre del script que se está ejecutando. Este parámetro es válido en todos los scripts. Esta variable automática se presenta en PowerShell 3.0.

  • $PSScriptRoot : contiene el directorio desde el que se ejecuta un script. En PowerShell 2.0, esta variable solo es válida en módulos de script (.psm1). A partir de PowerShell 3.0, es válido en todos los scripts.

  • $MyInvocation - La $MyInvocation variable automática contiene información sobre el script actual, incluida la información sobre cómo se inició o "se invocó". Puede usar esta variable y sus propiedades para obtener información sobre el script mientras se ejecuta. Por ejemplo, . $MyInvocation La variable MyCommand.Path contiene la ruta de acceso y el nombre de archivo del script. $MyInvocation. La línea contiene el comando que inició el script, incluidos todos los parámetros y valores.

    A partir de PowerShell 3.0, $MyInvocation tiene dos nuevas propiedades que proporcionan información sobre el script que llamó o invocó el script actual. Los valores de estas propiedades se rellenan solo cuando el invocador o el autor de la llamada es un script.

    • PSCommandPath contiene la ruta de acceso completa y el nombre del script que llamó o invocó el script actual.

    • PSScriptRoot contiene el directorio del script que llamó o invocó el script actual.

    A diferencia de las $PSCommandPath variables y $PSScriptRoot automáticas, que contienen información sobre el script actual, las propiedades PSCommandPath y PSScriptRoot de la $MyInvocation variable contienen información sobre el script que llamó al script actual.

  • Secciones de datos: puede usar la palabra clave para separar los Data datos de la lógica en scripts. Las secciones de datos también pueden facilitar la localización. Para obtener más información, consulte about_Data_Sections y about_Script_Internationalization.

  • Firma de scripts: puede agregar una firma digital a un script. En función de la directiva de ejecución, puede usar firmas digitales para restringir la ejecución de scripts que podrían incluir comandos no seguros. Para obtener más información, consulte about_Execution_Policies y about_Signing.

Consulte también