我已经检查了该问题的可能重复项,但无法通过给定的答案解决问题。
我有一个脚本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”,因为路径中可能存在空格,因此我总是需要添加双引号。
我尝试了几种方法,但是没有用。
答案 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"""