powershell无法找到安装在同一脚本中的软件

时间:2018-03-09 11:21:11

标签: powershell amazon-web-services amazon-s3

我在AWS windows EC2堆栈创建云形式脚本的userdata部分编写了以下powershell脚本。我可以使用脚本安装AWSCLI,但安装cmdlet后脚本无法识别'aws s3 cp'命令。  当我登录EC2实例时,我能够从powershell提示中成功运行aws s3 cp命令。 任何人都能说出我做错了什么。

{
    "contents":[
        "<powershell> ","\n",
        "$awscliurl = \"https://s3.amazonaws.com/aws-cli/AWSCLI64.msi\"  \n",
        "$awsclidownloadloc = \"C:/Windows/Temp/AWSCLI64.msi\"  \n",
        "(New-Object System.Net.WebClient).DownloadFile($awscliurl, $awsclidownloadloc)   \n",
        "$argstr =  \"/I  C:\\Windows\\Temp\\AWSCLI64.msi  /quiet /L*v   ./awscli-output.log\"  \n",
        "Start-Process msiexec.exe -Wait -ArgumentList $argstr   \n",
        "Start-Process powershell.exe  -RedirectStandardOutput  c:\\s3out.txt  -RedirectStandardError c:\\s3err.out  -Wait -ArgumentList \"aws s3 cp s3://mybucket/myfile.exe  c:\\myfile.exe\"  \n",
        "</powershell>"
    ]
}

当我看到s3err.out时,我看到了下面的

aws:术语“aws”未被识别为cmdlet,函数,脚本文件或可操作程序的名称。检查 拼写名称,或者如果包含路径,请验证路径是否正确,然后重试。 在行:1个字符:1 + aws s3 cp s3://mybucket/myfile.exe c:\ myfile.exe + ~~~     + CategoryInfo:ObjectNotFound:(aws:String)[],CommandNotFoundException     + FullyQualifiedErrorId:CommandNotFoundException

2 个答案:

答案 0 :(得分:1)

&#34; AWS&#34;是一个位于&#34; C:\ Program Files \ Amazon \ AWSCLI \ aws.exe&#34;的可执行文件。当用户数据脚本启动时,系统PATH环境变量不包括AWS CLI目录,因此即使在安装后也无法找到它。当您登录时,您将获得包含cli的更新PATH,因此当您手动登录和测试时它将起作用。

在您的用户数据中,您应该可以替换&#34; aws&#34;对于绝对路径,但您需要确保其正确转义。

以下是未经测试的,但我认为应该有效。使用PowerShell`转义字符,您可以在双引号字符串中包含双引号...

-ArgumentList "`"C:\Program Files\Amazon\AWSCLI\aws.exe`" cp ..."

为了使这个JSON友好,我们需要进一步转义双引号,以便整行变为:

"Start-Process powershell.exe  -RedirectStandardOutput  c:\\s3out.txt  -RedirectStandardError c:\\s3err.out  -Wait -ArgumentList \"`\"C:\Program Files\Amazon\AWSCLI\aws.exe`\" s3 cp s3://mybucket/myfile.exe  c:\\myfile.exe\"  \n",

另一种方法是将PowerShell cmdlet用于S3:

Read-S3Object -BucketName mybucket -Key myfile.exe -File c:\\myfile.exe

答案 1 :(得分:0)

我也遇到了同样的问题,在安装aws cli后添加了以下代码,对我有用。

$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")