从命令行使用带引号的参数执行Powershell脚本 [英] Executing Powershell script from command line with quoted parameters

查看:61
本文介绍了从命令行使用带引号的参数执行Powershell脚本的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在自动构建旧版MS Access应用程序,并且在其中一个步骤中,我试图使Access可执行文件(.ADE).我想出了以下代码,这些代码存储在文件(PSLibrary.ps1)中:

I am automating the build of a legacy MS Access application, and in one of the steps, I am trying to make an Access executable (.ADE). I have come up with the following code, which is stored in a file (PSLibrary.ps1):

Add-Type -AssemblyName Microsoft.Office.Interop.Access

function Access-Compile {
param (
    [Parameter(Mandatory=$TRUE,Position=1)][string]$source,
    [Parameter(Mandatory=$TRUE,Position=2)][string]$destination
)
    Write-Output "Starting MS Access"
    $access = New-Object -ComObject Access.Application
    $access.Visible = $FALSE
    $access.AutomationSecurity = 1

    if (!(Test-Path $source)) { Throw "Source '$source' not found" }
    if ((Test-Path $destination)) {
        Write-Output "File '$destination' already exists - deleting..."
        Remove-Item $destination
    }

    Write-Output "Compiling '$source' to '$destination'"
    $result = $access.SysCmd(603, $source, $destination)

    $result

    Write-Output "Exiting MS Access"
    $access.quit()
}

如果我进入PowerShell ISE并运行以下命令,则一切正常,并创建了预期的输出:

If I go into the PowerShell ISE and run the command below, then everything works fine, and the expected output is created:

PS C:>& "C:\Temp\PSLibrary.ps1"
PS C:>Access-Compile "C:\Working\Project.adp" "C:\Working\Project.ade"

但是,我似乎无法像在自动构建中那样,生成正确的轨迹来从命令行运行它.例如,

However, I can't seem to generate the right hocus-pocus to get this running from the command line, as I would in an automated build. For instance,

powershell.exe -command "& \"C:\\Temp\\PSLibrary.ps1\" Access-Compile \"C:\\Temp\\Project.adp\" \"C:\\Temp\\Project.ade\""

我在做什么错了?

推荐答案

对于复杂的参数,可以使用Powershell的 -EncodedCommand 参数.它将接受Base64编码的字符串.引号,斜杠等不需要转义.

For complex parameters, you can use Powershell's -EncodedCommand parameter. It will accept a Base64 encoded string. No escaping is needed for quotes, slashes and such.

考虑一个测试功能,该功能将打印其参数.像这样

Consider a test function that will print its parameters. Like so,

function Test-Function {
param (
    [Parameter(Mandatory=$TRUE,Position=1)][string]$source,
    [Parameter(Mandatory=$TRUE,Position=2)][string]$destination
)
    write-host "src: $source"
    write-host "dst: $destination"
}

创建命令以加载脚本和一些参数.像这样

Create command to load the script and some parameters. Like so,

# Load the script and call function with some parameters
. C:\Temp\Calling-Test.ps1;  Test-Function "some\special:characters?" "`"c:\my path\with\spaces within.ext`""

命令语法确定后,将其编码为Base64形式.像这样

After the command syntax is OK, encode it into Base64 form. Like so,

[System.Convert]::ToBase64String([System.Text.Encoding]::UNICODE.GetBytes('. C:\Temp\Calling-Test.ps1;  Test-Function "some\special:characters?" "`"c:\my path\with\spaces within.ext`""'))

您将获得一个Base64字符串.像这样

You'll get a Base64 string. Like so,

<代码> LgAgAEMAOgBcAFQAZQBtAHAAXABDAGEAbABsAGkAbgBnAC0AVABlAHMAdAAuAHAAcwAxADsAIAAgAFQAZQBzAHQALQBGAHUAbgBjAHQAaQBvAG4AIAAiAHMAbwBtAGUAXABzAHAAZQBjAGkAYQBsADoAYwBoAGEAcgBhAGMAdABlAHIAcwA/ACIAIAAiAGAAIgBjADoAXABtAHkAIABwAGEAdABoAFwAdwBpAHQAaABcAHMAcABhAGMAZQBzACAAdwBpAHQAaABpAG4ALgBlAHgAdABgACIAIgA =

最后,启动Powershell并将编码后的字符串作为参数传递.像这样

Finally, start Powershell and pass the encoded string as a parameter. Like so,

# The parameter string here is abreviated for readability purposes.
# Don't do this in production
C:\>powershell -encodedcommand LgAgA...
Output
src: some\special:characters?
dst: "c:\my path\with\spaces within.ext"

以后是否要反转Base64编码,将其传递给解码方法.像这样

Should you later want to reverse the Base64 encoding, pass it into decoding method. Like so,

$str = " LgAgA..."
[Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String($str))
# Output
. C:\Temp\Calling-Test.ps1;  Test-Function "some\special:characters?" "`"c:\my path\with\spaces within.ext`""

这篇关于从命令行使用带引号的参数执行Powershell脚本的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆