![通过批处理文件执行 powershell 脚本](https://linux22.com/image/1486002/%E9%80%9A%E8%BF%87%E6%89%B9%E5%A4%84%E7%90%86%E6%96%87%E4%BB%B6%E6%89%A7%E8%A1%8C%20powershell%20%E8%84%9A%E6%9C%AC.png)
我正在尝试通过批处理文件执行 powershell 脚本,目前我只是测试它以使其运行,所以 .ps1 文件只是一个 hello world 脚本。
这几乎可以正常工作,除了有一个扳手需要投入使用;
我正在尝试将 .ps1 存储在远程位置(具体来说是在共享 NAS 上)。当我将 .ps1 保存在本地并将 .bat 指向本地 .ps1 时,此方法有效。
但是现在.ps1 位于远程位置,我遇到了以下错误;
“无法加载文件(路径名)。文件(路径名)未经数字签名。该脚本将不会在系统上执行”
现在我知道了执行政策,我的政策如下;
MachinePolicy = RemoteSigned
UserPolicy = Undefined
Process = Undefined
CurrentUser = RemoteSigned
LocalMachine = Bypass
我尝试将 CurrentUser 更改为 Bypass,但出现以下问题;
Windows Powershell 已成功更新您的执行策略,但该设置已被在更具体范围内定义的策略覆盖
任何想法都将不胜感激!
抱歉,信息量太大了!如果有任何不清楚的地方,请随时让我澄清!我对这些都还不太熟悉!
答案1
您仍然可以运行该脚本 - 您只需要告诉 PowerShell 绕过系统的执行策略,如下所示:
powershell.exe -executionpolicy bypass -file \\server\share\yourscript.ps1
答案2
关注此主题:
https://community.idera.com/database-tools/powershell/powertips/b/tips/posts/converting-powershell-to-batch
您可以使用此 PowerShell 函数轻松地将任何 PowerShell 脚本转换为批处理文件:
function Convert-PowerShellToBatch
{
param
(
[Parameter(Mandatory,ValueFromPipeline,ValueFromPipelineByPropertyName)]
[string]
[Alias("FullName")]
$Path
)
process
{
$encoded = [Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes((Get-Content -Path $Path -Raw -Encoding UTF8)))
$newPath = [Io.Path]::ChangeExtension($Path, ".bat")
"@echo off`npowershell.exe -NoExit -encodedCommand $encoded" | Set-Content -Path $newPath -Encoding Ascii
}
}
转换全部目录内的 PowerShell 脚本,只需运行以下命令:
Get-ChildItem -Path <DIR-PATH> -Filter *.ps1 |
Convert-PowerShellToBatch
所需文件夹的路径在哪里?例如:
Get-ChildItem -Path "C:\path\to\powershell\scripts" -Filter *.ps1 |
Convert-PowerShellToBatch
要转换单身的PowerShell 脚本,只需运行以下命令:
Get-ChildItem -Path <FILE-PATH> |
Convert-PowerShellToBatch
所需文件的路径在哪里。
转换后的文件位于源目录中。即<文件路径>或者<目录路径>。
答案3
我认为公司配置的组策略正在强制执行从远程位置撤销任何脚本执行的策略。请在管理工具中检查组策略。
答案4
对于仅限 .bat 方面,解决方法是制作一个使用 echo 语句构建本地 powershell 脚本的 .bat 文件,然后执行本地脚本
这是否实用取决于脚本的复杂程度