Linux 在VM中使用Invoke-azvmrun命令运行脚本?传递参数问题

Linux 在VM中使用Invoke-azvmrun命令运行脚本?传递参数问题,linux,bash,azure,powershell,Linux,Bash,Azure,Powershell,问题描述:当您创建参数作为对象并将其传递给VM Windows PS all时,您可以使用name=value,但在linux虚拟机上,情况并非如此,您只能获得未知顺序的值 准备: echo '#!/bin/bash' >>.\msgtst.sh echo 'echo test: $1 $2 $3 $4 $5 $6' >>.\msgtst.sh $Script_paramz = @{"lgs" = "SARB"; "Event"="a1001"; "LogName"="x

问题描述:当您创建参数作为对象并将其传递给VM Windows PS all时,您可以使用name=value,但在linux虚拟机上,情况并非如此,您只能获得未知顺序的值

准备:

echo '#!/bin/bash' >>.\msgtst.sh
echo 'echo test: $1 $2 $3 $4 $5 $6' >>.\msgtst.sh
$Script_paramz = @{"lgs" = "SARB"; "Event"="a1001"; "LogName"="xSystem" }
Invoke-AzVMRunCommand -ResourceGroupName VMResourceGroup -VMName LinuxVMName -ScriptPath ".\msgtst.sh" -CommandId RunShellScript -Parameter $Script_paramz -Verbose
$Script_paramz = @{"lgs" = "ARB"; "Event"="1001"; "LogName"="System" }
  • 来源:您的PC:Windows:在powershell中登录Azure
  • 目标:Azure:拥有Linux虚拟机,在我的例子中是ubuntu18
代码:

echo '#!/bin/bash' >>.\msgtst.sh
echo 'echo test: $1 $2 $3 $4 $5 $6' >>.\msgtst.sh
$Script_paramz = @{"lgs" = "SARB"; "Event"="a1001"; "LogName"="xSystem" }
Invoke-AzVMRunCommand -ResourceGroupName VMResourceGroup -VMName LinuxVMName -ScriptPath ".\msgtst.sh" -CommandId RunShellScript -Parameter $Script_paramz -Verbose
$Script_paramz = @{"lgs" = "ARB"; "Event"="1001"; "LogName"="System" }
尝试:

echo '#!/bin/bash' >>.\msgtst.sh
echo 'echo test: $1 $2 $3 $4 $5 $6' >>.\msgtst.sh
$Script_paramz = @{"lgs" = "SARB"; "Event"="a1001"; "LogName"="xSystem" }
Invoke-AzVMRunCommand -ResourceGroupName VMResourceGroup -VMName LinuxVMName -ScriptPath ".\msgtst.sh" -CommandId RunShellScript -Parameter $Script_paramz -Verbose
$Script_paramz = @{"lgs" = "ARB"; "Event"="1001"; "LogName"="System" }
[stdout] 测试:ARB系统1001

$Script_paramz = @{"lgs" = "SARB"; "Event"="a1001"; "LogName"="xSystem" }
[stdout] 测试:SARB xSystem a1001

$Script_paramz = @{"lgs" = "1SARB"; "Event"="C1001"; "LogName"="bSystem" }
[stdout] 测试:1安全气囊系统C1001

$Script_paramz = @{"par1" = "val1"; "par2"="val2"; "par3"="val3"; "par4"="val4"; "par5"="val5"; "par6"="val6" }
[stdout] 测试:val3 val6 val1 val2 val4 val5

Powershell输出:$Script_paramz

Name                           Value
----                           -----
par3                           val3
par6                           val6
par1                           val1
par2                           val2
par4                           val4
par5                           val5
有人能解决这个问题吗?

编辑:回答我如何解决这个问题,仍然想知道是否有可能正确地看到参数名称

$Script_paramz=@{“par1”=“par1=val1”;“par2”=“par2=val2”;“par3”=“par3=val3”}

#/bin/bash
par2='';par1='';par3='';
对于“$@”中的变量
做

IFS='='read-r-a数组是一个哈希表。在哈希表实现中,默认情况下不保留顺序。您可以尝试的一种方法是使用OrderedDictionary from

因此,powershell中的结果将是:

PS C:\Users\fielu> echo $Script_paramz 

Name                           Value
----                           -----
par1                           val1
par2                           val2
par3                           val3
par4                           val4
par5                           val5
par6                           val6

请提供回声测试的输出:“$@”
而不是
回声测试:$1$2$3$4$5$6
回声测试:$@$*test:val6 val2 val5 val1 val4 val3 val6 val2 val5 val1 val4 val3我可以将值转换为“par1”=“par1=val1”对,但这意味着我需要对linux脚本使用异常,我也在windows中使用它,没什么大不了的,但想了解这是如何工作的。是夜间睡眠还是您建议使用$@让我找到了解析参数的解决方案,如果有人知道如何从powershell获取参数名,我很想听听。谢谢,我尝试过用其他方式订购,这很有帮助,但我想以某种方式匹配name=value,如果没有人给出解决方案,那么我会将此标记为答案。@DaliusV你最终得到了这个结果吗?我遇到了同样的问题,从Powershell到bash的参数顺序错误