从powershell调用cmd无法正确解析?

时间:2015-10-07 20:01:59

标签: powershell curl cmd

我正在尝试从powershell运行cURL.exe,作为更大脚本的一部分,以便在新人加入时创建各种用户帐户。 (我不能使用invoke-method或invoke-webrequest,因为header参数不接受字符串)

问题是我可以完全从cmd窗口运行它,但我似乎无法从powershell运行同样的东西:

curl.exe -H "Authorization: {\"apiKey\":\"ResetAPIKey,\"username\":\"admin\"}"  -d "username=someUserName&email=somebody@domain.com&firstName=Joe&lastName=Friday"  "http://URL:8080/v1/users/create"

这从cmd运行得很好但是当试图从powershell运行时,我收到的错误就像找不到' url'或者'不支持该路径/方法'

其他格式尝试:

  • 将整个内容用单引号括起来

  • `" (反引号+双引号)替换每个 /" (正斜杠+双引号)

  • 将所有参数添加到here-string变量

  • 上述

  • 的变体

我会假设我可以将它写入.bat文件,然后从powershell运行它,但我不想被迫在可能的情况下执行此操作

3 个答案:

答案 0 :(得分:2)

stop parsing parameter是这类事情的不错选择。

  

Windows PowerShell 3.0中引入的停止解析符号( - %),       指示Windows PowerShell不要将输入解释为       Windows PowerShell命令或表达式。

在您的情况下,虽然您需要一些不同的东西,因为您需要混合中需要解决的变量。

我认为这会有一个骗局。大多数答案都是关于将curl.exe转换为类似Invoke-WebRequest的内容,这是您应该研究的内容。在这种情况下,如果您有动态内容,请使用call operator这样的内容。

$arguments = "-H ""Authorization: {\""apiKey\"":\""ResetAPIKey,\""username\"":\""admin\""}""  -d ""username=someUserName&email=somebody@domain.com&firstName=Joe&lastName=Friday""  ""http://URL:8080/v1/users/create"""
&"curl.exe" $arguments

注意到我将字符串的内部引号加倍。如果你看之后它会正确显示变量。现在你应该能够做出改变了。

答案 1 :(得分:2)

将复杂的命令行从PowerShell传递到本机应用程序可能会非常棘手。在某些情况下,PowerShell可以添加额外的引号。尽管如此,规则并不复杂,但它们并不是很好(如果有的话)记录在案,而且v2-v4与v5中的规则也有一些实质性的变化。恕我直言,使用停止解析运算符--%作为@Matt提供,是最好的方法,以防你以v3 +为目标。

停止解析运算符不会限制您仅使用文字字符串。你仍然可以使用变量。该运算符以CMD语法扩展环境变量:%VariableName%。因此,您可以将所需的值分配给某些环境变量,并在命令行中使用它们:

$Env:Env_UserName='someUserName'
$Env:Env_Email='somebody@domain.com'
$Env:Env_FirstName='Joe'
$Env:Env_LastName='Friday'
curl.exe --% -H "Authorization: {\"apiKey\":\"ResetAPIKey,\"username\":\"admin\"}"  -d "username=%Env_UserName%&email=%Env_Email%&firstName=%Env_FirstName%&lastName=%Env_LastName%"  "http://URL:8080/v1/users/create"

其他变体将生成完整的参数行,您希望传递给本机应用程序,而不是在单个环境变量中传递它:

$Arguments=...
$Env:Env_Arguments=$Arguments
curl.exe --% %Env_Arguments%

答案 2 :(得分:1)

马特对呼叫运营商的回答看起来应该可行,但如果不是,那么类似的替代方案我以前也好运过。您可以将它们作为数组传递,而不是将您的参数作为字符串传递,PowerShell将正确处理它们。在您的情况下,它看起来像这样:

$arguments = @("-H", 'Authorization: {\"apiKey\":\"ResetAPIKey,\"username\":\"admin\"}', "-d", '"username=someUserName&email=somebody@domain.com&firstName=Joe&lastName=Friday"', 'http://URL:8080/v1/users/create')

& "curl.exe" $arguments