Почему вызов скрипта PS1 из пакетного файла приводит к тому, что внешние скрипты не запускаются?

Почему вызов скрипта PS1 из пакетного файла приводит к тому, что внешние скрипты не запускаются?

Я работаю с некоторыми скриптами, где я вызываю некоторые скрипты PowerShell (.ps1) из пакетных файлов. Я не могу заставить это работать для этой конкретной ситуации:

У меня есть следующий пакетный файл:

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

Ошибка при запуске пакетного файла:(Я вставил «паузу» в конец пакетного файла, чтобы зафиксировать это; я получаю 8 из них, причем это последний, как указано в .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

Я подумал, что это может быть проблема с моим скриптом PS1, поэтому я открыл файл в PowerShell ISE и нажал F5, чтобы запустить скрипт. Когда я это делаю, происходит следующее, и мне приходится нажимать «Run Once» семь раз — по одному разу для каждой из команд, вызываемых в QuickAccessPin.ps1

введите описание изображения здесь

Итак, PS1 работает, хотя и не так, как должен, когда я запускаю его напрямую, но не работает вообще, когда я вызываю его из пакетного файла. Я также должен отметить, что в настоящее время для тестирования моя политика выполненияНеограниченный(обычноУдалённо подписанный). Более того, чтобы исключить любые проблемы, я также попробовал запустить следующее, чтобы PowerShell не предлагал в графическом интерфейсе запустить файлы:

@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 — это просто

Get-ChildItem r:\Tools | Unblock-File

...но это, похоже, ничего не делает, так как PowerShell ISE все еще предлагает мне запустить его, говоря, что я могу «разблокировать» файлы, если они безопасны (что я уже сделал, наверное, раз 13). Если я устанавливаю политику на RemoteSigned и затем запускаю скрипт выше, а затем снова Get-ExecutionPolicy, он показывает Unrestricted, поэтому 4-я строка работает, а 3-я, похоже, ничего не делает.

Так что тот факт, что он каждый раз предлагает мне это, является лишь незначительной неприятностью, потому что все это будет автоматизировано, и я вообще не буду использовать никаких графических интерфейсов. Но прямо сейчас я не могу вызвать скрипт PS1 из пакетного файла, что мне нужно, и единственный способ запустить мой скрипт — это сделать это вручную внутри ISE.

Кто-нибудь знает, как решить эту проблему?

решение1

Полученная вами ошибка указывает на то, что вы, вероятно, находитесь не в том каталоге, в котором, как вы думаете, находитесь, и выполнение файла сценария с полным путем не перенесет вас в этот каталог. Поэтому, если Set-QuickAccess.ps1он находится в R:\Tools, нет гарантии, что вы окажетесь в этом каталоге R:\Toolsпри выполнении пакетного файла.

Для начала вам нужно указать Set-Locationпуть, по которому Set-QuickAccess.ps1расположен скрипт.

Связанный контент