从另一个在路径中具有命名参数和空格的Powershell脚本中调用

时间:2018-11-28 14:05:18

标签: powershell

我已经检查了该问题的可能重复项,但无法通过给定的答案解决问题。

我有一个脚本install.ps1,其中包含一个名为参数-settingsFile

    param(
        [Parameter(Mandatory=$true)]
        [ValidateNotNullOrEmpty()]
        [string]$settingsFile
    )
    Write-Host "calling $PSCommandPath with settings file $settingsFile"
    If (!(Test-Path $settingsFile)){
        Write-Host "cannot load settings[ $settingsFile ], aborting "
        exit
    }
...
...

我想从另一个Powershell脚本中调用它,但是找不到给定的$ settingsFile。 这是呼叫者脚本

    Write-Host "BEGIN-------------------------------------------------------------"

    $configFile = [System.IO.Path]::GetFullPath((Join-Path $PSScriptRoot "..\install-data\settings.json"))
    Write-Host ""$configFile""
    If (Test-Path $configFile){
        Write-Host "config found"
    }
    else{
        Write-Host "config not found"
    }

    $argument = "-settingsFile=""$configFile"""
    Write-Host "$argument"
    $installFps = $($PSScriptRoot + "\scripts\install-fps\install-fps.ps1")
    Write-Host """$installFps""" $argument
    Write-Host "case 1: $installFps $argument"
    & $installFps $argument
    Write-Host "END-------------------------------------------------------------"

这里是输出

    BEGIN-------------------------------------------------------------
    C:\Program Files\foo\install-data\settings.json
    config found
    -settingsFile="C:\Program Files\foo\install-data\settings.json"
    "C:\Program Files\foo\install-data\scripts\install-fps\install-fps.ps1" -settingsFile="C:\Program Files\foo\install-data\settings.json"
    case 1: C:\Program Files\foo\install-data\scripts\install-fps\install-fps.ps1 -settingsFile="C:\Program Files\foo\install-data\settings.json"
    calling C:\Program Files\foo\install-data\scripts\install-fps\install-fps.ps1 with settings file -settingsFile="C:\Program Files\foo\install-data\settings.json"
    cannot load settings[ -settingsFile="C:\Program Files\foo\install-data\settings.json" ], aborting
    END-------------------------------------------------------------

当我从powershell命令行手动调用脚本时,它可以工作,但是当我将此脚本与该脚本一起使用时,它不起作用。 settingsFile确实存在,我可以确保。似乎我的参数没有正确传输到install.ps1脚本中,因为在注销后,我可以看到完整的字符串“ -settingsFile =“ C:\ Program Files \ foo \ install-data \ settings.json”不仅要传输文件路径“ C:\ Program Files \ foo \ install-data \ settings.json”,因为路径中可能存在空格,因此我总是需要添加双引号。

我尝试了几种方法,但是没有用。

2 个答案:

答案 0 :(得分:2)

问题在于您输入参数的方式:

$argument = "-settingsFile=""$configFile"""

settingsFile是一个命名参数,但是您在参数名和值之间包含=,这是错误的语法。

这导致powershell将其解释为-settingsFile="C:\Program Files\foo\install-data\settings.json"的单个字符串,并将其发送到位置1的参数。

哪个叫这个:

-settingsFile '-settingsFile="C:\Program Files\foo\install-data\settings.json"'

这通过错误消息中出现的参数名称来显示:

  

无法加载设置[ -settingsFile =“ C:\ Program Files \ foo \ install-data \ settings.json” ],正在中止

易于修复,只需删除=

$argument = "-settingsFile ""$configFile"""

答案 1 :(得分:1)

PowerShell已确定您的settingsFile变量的值为'settingsFile =“ C:\ Program Files \ foo \ install-data \ settings.json”'。这是因为等号。它将其视为位置参数,而不是命名参数。

尝试用冒号或空格替换等号。

$argument = "-settingsFile:""$configFile"""

$argument = "-settingsFile ""$configFile"""