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

1

Estou trabalhando com alguns scripts em que estou chamando alguns scripts do PowerShell (.ps1) de arquivos em lote. Eu não consigo fazer isso funcionar para essa situação específica:

Eu tenho o seguinte arquivo em 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"

Erro ao executar o arquivo de lote: (inseri 'pause' no final do arquivo de lote para capturá-lo; recebo 8 deles, sendo este o último indicado por o .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

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

Então,oPS1estáfuncionando,emboranãocomodeveria,quandoeuoexecutodiretamente,masnãoestoufuncionandoquandoeuochamodoarquivoemlote.Tambémdevosalientarque,atualmente,paratestes,minhaPolíticadeExecuçãoéIrrestrito(geralmenteRemoteSigned).Alémdisso,paraeliminarquaisquerproblemas,tambémtenteiexecutaroabaixo,paraqueoPowerShellnãosolicitenaGUIaexecuçãodosarquivos:

@echooffTITLEUnblockingPowerShellToolscolorf0PowerShell-NoProfile-ExecutionPolicyBypass-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, já que o PowerShell ISE ainda me pede para executá-lo, dizendo que posso "desbloquear" os arquivos se eles estiverem seguros (o que eu já fiz talvez 13 vezes agora). Se eu definir minha política como RemoteSigned e depois executar o script acima, então Get-ExecutionPolicy novamente, mostrará Irrestrito, portanto a quarta linha funciona e a terceira não parece fazer nada.

Assim, o fato de que isso me avisa toda vez é apenas um pequeno aborrecimento, porque tudo isso será automatizado e eu não usarei nenhuma GUI. Mas agora, não consigo chamar o script PS1 do arquivo de lote, que preciso fazer, e a única maneira de executar meu script é fazer manualmente dentro do ISE.

Alguém sabe como posso resolver este problema?

    
por InterLinked 31.08.2017 / 17:19

1 resposta

2

O erro que você está recebendo indica que você provavelmente não está no diretório em que acredita estar, e a execução do scriptfile com o caminho completo não o coloca nesse diretório - portanto, se Set-QuickAccess.ps1 estiver em R:\Tools , não é garantido que você esteja em R:\Tools quando executar o arquivo em lote.

Você precisa começar fazendo Set-Location no caminho em que o script Set-QuickAccess.ps1 está localizado.

    
por 31.08.2017 / 17:52