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


$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 = "$FileLocaleStartApps.ps1"
Write-Output $AntFile
Start-Process PowerShell.exe -ArgumentList "-command &$AntFile -UserCredential $Cred"  

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

感谢

虽然用ps2exe编译的可执行文件使用.ps1文件作为输入,但在运行时不涉及实际的.ps1文件,这就是为什么PowerShell的命令反射变量不能告诉您任何关于运行中的脚本文件的信息。

当运行实际的.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]请注意,在运行时,没有关于用作编译时输入原始.ps1文件的原始位置的信息,只有该文件的内容成为.exe文件的一部分

最新更新