我正在尝试从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运行它,但我不想被迫在可能的情况下执行此操作
答案 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)
$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