Running curl command in Github-actions on windows image.
jobs:
build:
runs-on: windows-latest
steps:
- uses: actions/checkout@v3
- name: build dists
run: |
curl.exe -i --user "${{secrets.User}}:${{secrets.Password}}" -H "X-Checksum-Md5:$MD5SUM" -X PUT "${{ env.URL }}\${{ env.PATH }}\$FILE_NAME\${{ github.sha }}.zip" --upload-file $FILE_NAME.zip
I am receiving the error curl: option --upload-file: requires parameter
I am unable to find what parameter I am missing. I have checked the curl man page and scoured the internet and I have found no answer.
I have changed the formation of the curl inputs.
curl.exe -i --user "${{secrets.User}}:${{secrets.Password}}" -H "X-Checksum-Md5:$MD5SUM" --upload-file $FILE_NAME.zip "${{ env.URL }}\${{ env.PATH }}\$FILE_NAME\${{ github.sha }}.zip"
This change results in the error curl: no URL specified!
CodePudding user response:
tl;dr
PowerShell interprets $FILE_NAME.zip
as trying to get the value of a property named zip
of the object stored in variable $FILE_NAME
.
To treat the .zip
part literally, as you intend, you have the following options:
Use
"$FILE_NAME.zip"
, i.e. explicitly make it an expandable (double-quoted) stringInside
"..."
,.
has no special meaning, except if inside an embedded subexpression ($(...)
) - see this answer for a systematic overview of the interpolation rules of expandable strings.Even selective double-quoting would work -
$FILE_NAME".zip"
- but such compound string arguments are tricky in PowerShell, because they only work as intended if the first component is unquoted - see this answer.
Use
$FILE_NAME`.zip
, i.e. escape the.
character, using`
, the so-called backtick, PowerShell's escape character.If appropriate, use
.\$FILE_NAME.zip
- starting the argument with a character other than$
in essence treats it as if it were enclosed in"..."
.
Therefore, using the first option (note the "$FILE_NAME.zip"
at the end):
jobs:
build:
runs-on: windows-latest
steps:
- uses: actions/checkout@v3
- name: build dists
run: |
curl.exe -i --user "${{secrets.User}}:${{secrets.Password}}" -H "X-Checksum-Md5:$MD5SUM" -X PUT "${{ env.URL }}\${{ env.PATH }}\$FILE_NAME\${{ github.sha }}.zip" --upload-file "$FILE_NAME.zip"
Background information:
$FILE_NAME.zip
is parsed as a property access; that is, an attempt is made to retrieve the value of a property named zip
on whatever object the $FILE_NAME
variable contains.
Since a string object has no .zip
property, PowerShell returns $null
, which, when passed as an argument to an external program such as curl
, in effect passes no argument at all, which explains the errors you saw.
Note that if your argument didn't start with $FILE_NAME
, it would implicitly have been treated like an expandable string; therefore, an alternative to "$FILE_NAME.zip"
is to use .\$FILE_NAME.zip
in this case.
The rules for how PowerShell interprets unquoted tokens as command arguments are complex - see this answer for a systematic overview.