Por que chamar um script PS1 de um arquivo em lote faz com que ele não execute scripts externos?

Por que chamar um script PS1 de um arquivo em lote faz com que ele não execute scripts externos?

Estou trabalhando com alguns scripts nos quais chamo alguns scripts do PowerShell (.ps1) de arquivos em lote. Não consigo fazer isso funcionar para esta situação específica:

Eu tenho o seguinte arquivo em lote:

@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"

Erro ao executar o arquivo em lote:(Inseri 'pause' no final do arquivo em lote para capturar isso; recebo 8 deles, sendo este o último conforme indicado pelo .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

Achei que poderia ser um problema com meu script PS1, então abri o arquivo no PowerShell ISE e pressionei F5 para executar o script. Quando faço isso, acontece o seguinte e tenho que clicar em "Executar uma vez" sete vezes - uma vez para cada um dos comandos chamados em QuickAccessPin.ps1

insira a descrição da imagem aqui

Portanto, o PS1 está funcionando, embora não como deveria, quando eu o executo diretamente, mas não funciona quando eu o chamo do arquivo em lote. Devo também salientar que atualmente para testes, minha Política de Execução éIrrestrito(geralmenteAssinado remotamente). Além disso, para eliminar quaisquer problemas, também tentei executar o seguinte para que o PowerShell não solicite na GUI a execução dos arquivos:

@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 é simplesmente

Get-ChildItem r:\Tools | Unblock-File

... mas isso não parece fazer nada, pois o PowerShell ISE ainda me solicita para executá-lo, dizendo que posso "desbloquear" os arquivos se eles estiverem seguros (o que já fiz talvez 13 vezes). Se eu definir minha política como RemoteSigned e executar o script acima, Get-ExecutionPolicy novamente mostrará Unrestricted, então a 4ª linha funciona e a 3ª parece não fazer nada.

Portanto, o fato de ele me avisar todas as vezes é apenas um pequeno aborrecimento, porque tudo isso será automatizado e não usarei nenhuma GUI. Mas, no momento, não consigo chamar o script PS1 do arquivo em lote, o que preciso fazer, e a única maneira de executar meu script é fazê-lo manualmente dentro do ISE.

Alguém sabe como posso resolver esse problema?

Responder1

O erro que você está recebendo indica que você provavelmente não está no diretório em que pensa estar, e a execução do arquivo de script com o caminho completo não o coloca nesse diretório - portanto, se Set-QuickAccess.ps1estiver em R:\Tools, não há garantia de que estará presente R:\Toolsquando você executar o arquivo em lote.

Você precisa começar fazendo um Set-Locationno caminho onde o Set-QuickAccess.ps1script está localizado.

informação relacionada