¿Por qué llamar a un script de PS1 desde un archivo por lotes hace que no se ejecuten scripts externos?

¿Por qué llamar a un script de PS1 desde un archivo por lotes hace que no se ejecuten scripts externos?

Estoy trabajando con algunos scripts en los que llamo a algunos scripts de PowerShell (.ps1) desde archivos por lotes. No puedo hacer que esto funcione para esta situación particular:

Tengo el siguiente archivo por lotes:

@echo off
TITLE Modifying Quick Access Pinned Items
color f0
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& 'r:\Tools\QuickAccessPin.ps1'";

QuickAccessPin.ps1:

.\Set-QuickAccess.ps1 -Action Unpin -Path "$env:userprofile\Desktop"
.\Set-QuickAccess.ps1 -Action Unpin -Path "$env:userprofile\Downloads"
.\Set-QuickAccess.ps1 -Action Unpin -Path "$env:userprofile\Documents"
.\Set-QuickAccess.ps1 -Action Pin -Path "$env:userprofile"
.\Set-QuickAccess.ps1 -Action Pin -Path "$env:userprofile\Desktop"
.\Set-QuickAccess.ps1 -Action Pin -Path "$env:userprofile\Documents"
.\Set-QuickAccess.ps1 -Action Pin -Path "$env:userprofile\Downloads"

Error al ejecutar el archivo por lotes:(Inserté 'pausa' al final del archivo por lotes para capturar esto; obtengo 8 de estos, siendo este el último como lo indica .ps1:8)

.\Set-QuickAccess.ps1 : The term '.\Set-QuickAccess.ps1' 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 R:\Tools\QuickAccessPin.ps1:7 char:1
+ .\Set-QuickAccess.ps1 -Action Pin -Path "$env:userprofile\Downloads
+ ~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (.\Set-QuickAccess.ps1:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

Pensé que podría ser un problema con mi script de PS1, así que abrí el archivo en PowerShell ISE y presioné F5 para ejecutar el script. Cuando hago eso, sucede lo siguiente y tengo que hacer clic en "Ejecutar una vez" siete veces, una vez para cada uno de los comandos llamados en QuickAccessPin.ps1.

ingrese la descripción de la imagen aquí

Entonces, la PS1 funciona, aunque no como se supone que debe hacerlo, cuando la ejecuto directamente, pero no funciona en absoluto cuando la llamo desde el archivo por lotes. También debo señalar que actualmente para pruebas, mi Política de ejecución esIrrestricto(generalmenteFirmado remoto). Es más, para eliminar cualquier problema, también intenté ejecutar lo siguiente para que PowerShell no solicite en la GUI que ejecute los archivos:

@echo off
TITLE Unblocking PowerShell Tools
color f0
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& 'r:\Tools\UnblockThisFolder.ps1'";
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& {Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope CurrentUser -Force}"

UnblockThisFolder.ps1 es simplemente

Get-ChildItem r:\Tools | Unblock-File

...pero eso no parece hacer nada ya que PowerShell ISE todavía me solicita que lo ejecute, diciendo que puedo "desbloquear" los archivos si son seguros (lo que ya he hecho tal vez 13 veces). Si configuro mi política en RemoteSigned y luego ejecuto el script anterior, luego Get-ExecutionPolicy nuevamente, muestra Sin restricciones, por lo que la cuarta línea funciona y la tercera no parece hacer nada.

Entonces, el hecho de que me avise cada vez es sólo una molestia menor, porque todo esto estará automatizado y no usaré ninguna GUI en absoluto. Pero en este momento, no puedo llamar al script PS1 desde el archivo por lotes, lo cual necesito poder hacer, y la única manera de ejecutar mi script es hacerlo manualmente dentro del ISE.

¿Alguien sabe cómo puedo solucionar este problema?

Respuesta1

El error que estás recibiendo indica que probablemente no estés en el directorio en el que crees que estás, y ejecutar el archivo de script con la ruta completa no te ubica en ese directorio; por lo tanto, si Set-QuickAccess.ps1está en R:\Tools, no estás garantizado. estar R:\Toolscuando ejecute el archivo por lotes.

Debe comenzar haciendo un acceso Set-Locationa la ruta donde Set-QuickAccess.ps1se encuentra el script.

información relacionada