Why your curl commands fail on Windows, and how to fix them without installing WSL.
If you are a Java developer moving between Linux servers and a local Windows environment, you have probably hit this wall. You copy a perfectly valid curl command from a tutorial or documentation, paste it into your PowerShell terminal, and get a wall of red text.
I ran into this while testing S3entinel, my Spring Boot file ingestion service. I wanted to manually test my new Controller endpoint, but my terminal refused to cooperate.
The Setup
I had just deployed a FileController in Spring Boot that accepts multipart/form-data uploads.
@PostMapping("/upload")
public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file) {
// ... logic to handle file bytes
return ResponseEntity.accepted().body("File accepted for processing.");
}
To test it quickly without opening Postman, I ran this standard command:
curl -X POST -F "file=@wb.jpg" http://localhost:8080/api/v1/files/upload
The Error
Instead of a 202 Accepted response, PowerShell threw an exception I didn't expect:
Invoke-WebRequest : A parameter cannot be found that matches parameter name 'X'.
At line:1 char:6
+ curl -X POST -F "file=@wb.jpg" ...
+ ~~
+ CategoryInfo : InvalidArgument: (:) [Invoke-WebRequest], ParameterBindingException
+ FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
The "Aha!" Moment
The error message Invoke-WebRequest gives it away.
In PowerShell, curl is not the actual cURL binary we know and love from Linux. It is an Alias for a native Windows cmdlet called Invoke-WebRequest.
While Invoke-WebRequest is powerful, it does not share the same syntax flags as standard cURL:
- It doesn't use
-Xfor methods (it uses-Method). - It doesn't use
-Ffor form data (it uses-Form).
So, when I typed curl -X, PowerShell thought I was passing a parameter named -X to Invoke-WebRequest, which doesn't exist.
The Fix: Be Explicit
You don't need to rewrite your command into PowerShell syntax (which is verbose). You just need to tell PowerShell to ignore its alias and use the actual executable installed on your system.
By appending .exe, you bypass the alias lookup and run the program directly.
The Working Command
curl.exe -v -X POST -F "file=@wb.jpg" http://localhost:8080/api/v1/files/upload
Why this works:
curl: PowerShell sees an alias for Invoke-WebRequest.
curl.exe: PowerShell looks for an executable file in your System PATH. Since Git Bash or Windows System32 usually installs the real cURL, it finds the Linux-compatible tool.
Summary
When working in hybrid environments (Windows Local + Linux Cloud), "simple" commands often break due to shell differences.
If you see Invoke-WebRequest errors when you meant to run curl, remember: When in doubt, add .exe.
Code Reference:
Top comments (0)