script - powershell exercises for beginners
¿Hay alguna manera de hacer que el script de powershell funcione haciendo doble clic en el archivo.ps1? (16)
Estoy distribuyendo el guión de Powershell a mi equipo. La secuencia de comandos es obtener la dirección IP del cliente de Vsphere, hacer la conexión de mstsc y registrarla en un archivo compartido.
En el momento en que usaron el script, llegaron a conocer la dirección IP de la máquina. Después de eso, siempre tienden a usar mstsc directamente en lugar de ejecutar el script de powershell. (Como están usando mstsc, no puedo saber si están usando la máquina virtual con frecuencia o no)
Principalmente me están diciendo que correr powershell no es sencillo.
Estoy enfermo por su pereza.
¿Hay alguna manera de hacer que el script de powershell funcione haciendo doble clic en el archivo .ps1?
- Navegue REGEDIT a HKEY_LOCAL_MACHINE / SOFTWARE / Classes / Microsoft.PowerShellScript.1 / Shell
- En el panel derecho, haga doble clic en "(Predeterminado)"
- Elimine el valor existente de "Abrir" (que inicia el Bloc de notas) y escriba "0" (que es cero, lo que inicia Powershell directamente).
Revierte el valor si deseas usar Notepad como el predeterminado de nuevo.
Comandos simples de powershell para configurar esto en el registro;
New-PSDrive -Name HKCR -PSProvider Registry -Root HKEY_CLASSES_ROOT
Set-ItemProperty -Path "HKCR:/Microsoft.PowerShellScript.1/Shell/open/command" -name ''(Default)'' -Value ''"C:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe" -noLogo -ExecutionPolicy unrestricted -file "%1"''
Crea un atajo con algo así como el "Objetivo":
powershell.exe -command "& ''C:/A path with spaces/MyScript.ps1'' -MyArguments blah"
Desde http://www.howtogeek.com/204166/how-to-configure-windows-to-work-with-powershell-scripts-more-easily :
Establezca el valor predeterminado para HKEY_CLASSES_ROOT/Microsoft.PowerShellScript.1/Shell
en 0
Escribí esto hace unos años (ejecutarlo con derechos de administrador):
<#
.SYNOPSIS
Change the registry key in order that double-clicking on a file with .PS1 extension
start its execution with PowerShell.
.DESCRIPTION
This operation bring (partly) .PS1 files to the level of .VBS as far as execution
through Explorer.exe is concern.
This operation is not advised by Microsoft.
.NOTES
File Name : ModifyExplorer.ps1
Author : J.P. Blanc - [email protected]
Prerequisite: PowerShell V2 on Vista and later versions.
Copyright 2010 - Jean Paul Blanc/Silogix
.LINK
Script posted on:
http://www.silogix.fr
.EXAMPLE
PS C:/silogix> Set-PowAsDefault -On
Call Powershell for .PS1 files.
Done !
.EXAMPLE
PS C:/silogix> Set-PowAsDefault
Tries to go back
Done !
#>
function Set-PowAsDefault
{
[CmdletBinding()]
Param
(
[Parameter(mandatory=$false,ValueFromPipeline=$false)]
[Alias("Active")]
[switch]
[bool]$On
)
begin
{
if ($On.IsPresent)
{
Write-Host "Call Powershell for .PS1 files."
}
else
{
Write-Host "Try to go back."
}
}
Process
{
# Text Menu
[string]$TexteMenu = "Go inside PowerShell"
# Text of the program to create
[string] $TexteCommande = "%systemroot%/system32/WindowsPowerShell/v1.0/powershell.exe -Command ""&''%1''"""
# Key to create
[String] $clefAModifier = "HKLM:/SOFTWARE/Classes/Microsoft.PowerShellScript.1/Shell/Open/Command"
try
{
$oldCmdKey = $null
$oldCmdKey = Get-Item $clefAModifier -ErrorAction SilentlyContinue
$oldCmdValue = $oldCmdKey.getvalue("")
if ($oldCmdValue -ne $null)
{
if ($On.IsPresent)
{
$slxOldValue = $null
$slxOldValue = Get-ItemProperty $clefAModifier -Name "slxOldValue" -ErrorAction SilentlyContinue
if ($slxOldValue -eq $null)
{
New-ItemProperty $clefAModifier -Name "slxOldValue" -Value $oldCmdValue -PropertyType "String" | Out-Null
New-ItemProperty $clefAModifier -Name "(default)" -Value $TexteCommande -PropertyType "ExpandString" | Out-Null
Write-Host "Done !"
}
else
{
Write-Host "Already done !"
}
}
else
{
$slxOldValue = $null
$slxOldValue = Get-ItemProperty $clefAModifier -Name "slxOldValue" -ErrorAction SilentlyContinue
if ($slxOldValue -ne $null)
{
New-ItemProperty $clefAModifier -Name "(default)" -Value $slxOldValue."slxOldValue" -PropertyType "String" | Out-Null
Remove-ItemProperty $clefAModifier -Name "slxOldValue"
Write-Host "Done !"
}
else
{
Write-Host "No former value !"
}
}
}
}
catch
{
$_.exception.message
}
}
end {}
}
Esto es lo que uso para que los scripts se ejecuten como administrador de manera predeterminada:
Powershell.exe -Command "& {Start-Process PowerShell.exe -Verb RunAs -ArgumentList ''-File """%1"""''}"
Tendrá que pegar eso en regedit como el valor predeterminado para:
HKEY_CLASSES_ROOT/Microsoft.PowerShellScript.1/Shell/Open/Command
O aquí hay un script que lo hará por ti:
$hive = [Microsoft.Win32.RegistryKey]::OpenBaseKey(''ClassesRoot'', ''Default'')
$key = $hive.CreateSubKey(''Microsoft.PowerShellScript.1/Shell/Open/Command'')
$key.SetValue($null, ''Powershell.exe -Command "& {Start-Process PowerShell.exe -Verb RunAs -ArgumentList ''''-File """%1"""''''}"'')
Esto funcionó para mí en Windows 10 y en PowerShell 5.1:
- haga clic derecho en el archivo .ps1
- Abrir con...
- Elige otra aplicación
- Copie la ubicación de powershell.exe en la barra de direcciones (de manera predeterminada no mostrará la carpeta de Windows), es decir, C: / Windows / System32 / WindowsPowerShell / v1.0
- seleccione powershell.exe
- seleccione "Usar siempre esta aplicación para abrir archivos .ps1"
- haga clic en Aceptar
Esto se basa en la respuesta de KoZm0kNoT. Lo modifiqué para que funcione en todas las unidades.
@echo off
pushd "%~d0"
pushd "%~dp0"
powershell.exe -sta -c "& {./%~n0.ps1 %*}"
popd
popd
Las dos pushd / popds son necesarias en caso de que la cwd del usuario esté en una unidad diferente. Sin el conjunto externo, la cwd en el disco con el script se perderá.
Estoy de acuerdo en que configurar una configuración de sistema puede ser un poco demasiado, pero el acceso directo que requiere una ruta de acceso codificada no es ideal. Un archivo de bat realmente resuelve el problema muy bien
RunMyPowershellScript.bat
start powershell -command "& ''./MyPowershellScript.ps1'' -MyArguments blah"
Ahora se puede hacer doble clic en este archivo por lotes, los accesos directos se pueden crear fácilmente en el archivo por lotes y el script se puede implementar en cualquier carpeta.
O si desea que todos los archivos de PS1 funcionen como lo hacen los archivos de VBS, puede editar el registro de esta manera:
HKEY_CLASSES_ROOT/Microsoft.PowerShellScript.1/Shell/open/command
Edite el valor predeterminado para que sea algo así que ...
"C:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe" -noLogo -ExecutionPolicy unrestricted -file "%1"
Luego puede hacer doble clic en todos sus archivos .PS1 como desee. en mi humilde opinión, ser capaz de salir de la caja.
Llamaré a esto "The Powershell De-castration Hack". LOL disfruta!
Puede usar la funcionalidad de Windows ''SendTo'' para facilitar la ejecución de scripts de PS1. Usando este método, puedes hacer clic derecho en un script de PS1 y ejecutarlo. Esto no responde exactamente la pregunta OP, pero está cerca. Con suerte, esto es útil para otros. Por cierto ... esto es útil para una variedad de otras tareas.
- Busque / busque Powershell.exe
- Haga clic derecho en Powershell.exe y elija Abrir ubicación de archivo
- Haga clic derecho en Powershell.exe y elija Crear acceso directo. Guarde temporalmente un lugar como su escritorio
- Es posible que desee abrir como administrador de forma predeterminada. Seleccione Acceso directo> Propiedades> Avanzado> Abrir como administrador
- Abra la carpeta Sendto. Inicio> Ejecutar> Shell: Sendto
- Mueva el acceso directo de Powershell.exe a la carpeta Sendto
- Ahora debería poder hacer clic derecho en un script de PS1.
- Haga clic con el botón derecho en un archivo PS1, seleccione la opción Contexto SendTo> Seleccione el acceso directo Powershell
- Tu script PS1 debería ejecutarse.
Si está familiarizado con la administración avanzada de Windows, puede usar este paquete ADM (las instrucciones se incluyen en esa página) y permitir la ejecución de scripts PS después de hacer doble clic a través de esta plantilla y Local GPO. Después de esto, puede simplemente cambiar el programa predeterminado asociado al tipo de archivo .ps1 a powershell.exe
(usar búsqueda, está bastante oculto) y está listo para ejecutar scripts PS con doble clic.
De lo contrario, recomendaría seguir con otras sugerencias, ya que puede estropear todo el sistema con estas herramientas de administración.
Creo que la configuración predeterminada es demasiado estricta. Si alguien logra poner algún código malicioso en su computadora, entonces también puede eludir esta restricción (envolverlo en un archivo .cmd o .exe, o un truco con acceso directo) y todo lo que al final logra es solo para evitar que usted Manera fácil de ejecutar el script que has escrito.
Tendrás que modificar el registro. Primero, configure un PSDrive para HKEY_CLASSES_ROOT ya que no está configurado de manera predeterminada. El comando para esto es:
New-PSDrive HKCR Registry HKEY_CLASSES_ROOT
Ahora puede navegar y editar las claves de registro y los valores en HKEY_CLASSES_ROOT tal como lo haría en las unidades HKCU y HKLM PSDrives.
Para configurar doble clic para iniciar scripts de PowerShell directamente:
Set-ItemProperty HKCR:/Microsoft.PowerShellScript.1/Shell ''(Default)'' 0
Para configurar doble clic para abrir scripts de PowerShell en PowerShell ISE:
Set-ItemProperty HKCR:/Microsoft.PowerShellScript.1/Shell ''(Default)'' ''Edit''
Para restaurar el valor predeterminado (establece doble clic para abrir las secuencias de comandos de PowerShell en el Bloc de notas):
Set-ItemProperty HKCR:/Microsoft.PowerShellScript.1/Shell ''(Default)'' ''Open''
Tenga en cuenta que una de las características de seguridad de PowerShell es que los usuarios NO pueden iniciar secuencias de comandos con un doble clic. Tenga mucho cuidado si modifica esta configuración. Una alternativa podría ser empaquetar su script. Algunos editores como PrimalScript pueden hacer eso. Los usuarios aún necesitan PowerShell instalado, pero luego pueden hacer doble clic en el exe. Y parece que tu equipo necesita un poco de educación.
Utilicé esto: (necesito ejecutarlo solo una vez) también me aseguro de tener derechos para ejecutar:
de powershell con derechos elevados: Set-ExecutionPolicy = RemoteSigned
luego de un archivo bat
ftype Microsoft.PowerShellScript.1 = "C: / WINDOWS / system32 / windowspowershell / v1.0 / powershell.exe" -noexit ^ & ''%% 1''
assoc .ps1 = Microsoft.PowerShellScript.1
salida automática: eliminar -no salir
y voilá. doble clic a * .ps1 se ejecutará.
pongo un archivo .cmd simple en mi subcarpeta con mi archivo .ps1 con el mismo nombre, por lo que, por ejemplo, un script llamado "foobar" tendría "foobar.ps1" y "foobar.cmd". Entonces, para ejecutar .ps1, todo lo que tengo que hacer es hacer clic en el archivo .cmd del explorador o ejecutar .cmd desde el símbolo del sistema. Uso el mismo nombre base porque el archivo .cmd buscará automáticamente .ps1 con su propio nombre.
::====================================================================
:: Powershell script launcher
::=====================================================================
:MAIN
@echo off
for /f "tokens=*" %%p in ("%~p0") do set SCRIPT_PATH=%%p
pushd "%SCRIPT_PATH%"
powershell.exe -sta -c "& {./%~n0.ps1 %*}"
popd
set SCRIPT_PATH=
pause
El pushd / popd le permite iniciar el archivo .cmd desde el símbolo del sistema sin tener que cambiar al directorio específico donde se encuentran los scripts. Cambiará al directorio de scripts y luego cuando se complete volverá al directorio original.
También puede detener la pausa si desea que la ventana de comando desaparezca cuando finaliza el guión.
Si mi script .ps1 tiene parámetros, los solicito con indicaciones de la GUI utilizando .NET Forms, pero también hago que los scripts sean lo suficientemente flexibles como para aceptar parámetros si quiero pasarlos. De esta forma, puedo hacer doble clic en él desde Explorer y no tener que conocer los detalles de los parámetros, ya que me preguntará qué necesito, con cuadros de lista u otros formularios.