脚本将其他脚本调用为 .ps1 但不是使用 ps2exe 的 .exe

Script calls other script as .ps1 but not as a .exe using ps2exe

$password = ConvertTo-SecureString “Password+++” -AsPlainText -Force
$Cred = New-Object System.Management.Automation.PSCredential ("Admin", $password)
$FileLocale = Split-Path -Parent -Path $MyInvocation.MyCommand.Definition
Write-Output $FileLocale
$AntFile = "$FileLocale\StartApps.ps1"
Write-Output $AntFile
Start-Process PowerShell.exe -ArgumentList "-command &$AntFile -UserCredential $Cred"  

您好,该代码在 .ps1 中有效,我调用了另一个脚本,他成功了。但是当我在 ps2exe 的帮助下将它转换为 .exe 时,他不再做他的工作了。是否作为管理员。这不是我第一次使用该启动过程,但这是我第一次使用变量作为命令的目标。有谁知道 ps1 和 exe 之间出了什么问题?

谢谢

虽然使用 ps2exe 编译的可执行文件使用 .ps1 文件 作为输入 ,但 在运行时 没有实际涉及 .ps1 文件,这就是为什么 PowerShell 的 command-reflection 变量无法告诉您有关 运行 脚本的任何信息 file.

当 运行 实际 .ps1 文件 时,您将使用以下 about_Automatic_Variables:

  • $PSCommandPath 包含正在执行的 脚本文件 的完整文件路径。

  • $PSScriptRoot包含脚本文件的完整目录路径(即脚本文件所在目录的完整路径)。

在 ps2exe 编译的可执行文件 (.exe) 中,如果这些变量没有值,您可以改用以下内容:

  • [Environment]::GetCommandLineArgs()[0] 包含 可执行文件 的完整文件路径。

  • Split-Path -LiteralPath ([Environment]::GetCommandLineArgs()[0]) 包含可执行文件的完整 目录 路径。


应用于您的代码 - 假设您的 .exe 文件旁边有一个单独的 StartApp.ps1 文件:[1]

$FileLocale = Split-Path -LiteralPath ([Environment]::GetCommandLineArgs()[0])
$AntFile = Join-Path $FileLocale StartApps.ps1

如果您想使您的代码在两种 调用场景 - 原始.ps1 文件直接以及已编译的 .exe 文件 - 使用以下内容:

$FileLocale = 
  if ($PSScriptRoot) { $PSScriptRoot }
  else { Split-Path -LiteralPath ([Environment]::GetCommandLineArgs()[0]) }

$AntFile = Join-Path $FileLocale StartApps.ps1

[1] 请注意,在运行时 no 信息是可用的 original .ps1作为 compile-time 输入 的文件最初位于 - 只有该文件的 content 成为 .exe 文件的一部分。