為什麼從批次檔呼叫 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 執行該腳本。當我這樣做時,會發生以下情況,我必須單擊“運行一次”七次 - 對於 QuickAccessPin.ps1 中調用的每個命令一次

在此輸入影像描述

因此,當我直接運行 PS1 時,​​PS1 正在工作,儘管不是預期的那樣,但當我從批次檔呼叫它時,它根本不工作。我還應該指出,目前為了測試,我的執行策略是無限制(通常遠端簽名)。此外,為了消除任何問題,我還嘗試執行以下命令,以便 PowerShell 不會在 GUI 中提示執行檔案:

@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 行似乎沒有執行任何操作。

因此,它每次提示我的事實只是一個小煩惱,因為這一切都將是自動化的,我根本不會使用任何 GUI。但現在,我無法從批次檔中呼叫 PS1 腳本,而我需要能夠做到這一點,而讓腳本運行的唯一方法是在 ISE 內手動執行。

有誰知道我該如何解決這個問題?

答案1

您收到的錯誤表明您可能不在您認為所在的目錄中,並且使用完整路徑執行腳本文件不會將您放入該目錄 - 因此如果Set-QuickAccess.ps1is in R:\Tools,則不能保證您R:\Tools當你執行批次檔時

您需要先Set-Location對腳本所在的路徑執行 a 操作Set-QuickAccess.ps1

相關內容