我正在尝试使用通过csv文件提供的变量在远程计算机上运行可执行文件。 csv文件如下所示:(由查询远程计算机的变量组成-没问题)。
"Server","Command", "Arg1","Arg2","Arg3","FName"
Server1,C:\path\to\exe with spaces, /arg1, "arg2", arg3, filename
问题是我想以某种方式在“ Arg2”周围保留“”,但是我相信import-csv会删除它们。.
导入代码为:
Import-Csv $LogFolder\Machines.csv | ForEach-Object {
Invoke-Command ComputerName $_.Server {
param($Command, $Arg1, $Arg2, $Arg3, $FName)
$Command
} -Args $_.Arg1, $_.Arg2, $_.Arg3, $_.FName
}
我尝试使用&
将可执行文件的路径替换为$ Command。Import-Csv $LogFolder\Machines.csv | ForEach-Object {
Invoke-Command ComputerName $_.Server {
param($Command, $Arg1, $Arg2, $Arg3, $FName)
& "C:\path\to\exe with spaces"
} -Args $_.Arg1, $_.Arg2, $_.Arg3, $_.FName
}
该命令似乎正在运行,并且我什么也没回来,但是我希望在远程服务器上看到一个没有出现的文件...
上面的代码中我盲目缺少什么吗?
对不起,我仍在学习powershell,而我的google-fu目前无济于事。.:(
谢谢
答案 0 :(得分:0)
我对此csv文件进行了测试
"Server","Command", "Arg1","Arg2","Arg3","FName"
server,cmd, /c echo, test, this, <fullpath>\fname.txt
并使用此脚本执行它。
Import-Csv $LogFolder | ForEach-Object {
Invoke-Command -ComputerName $_.Server -ScriptBlock {
param($arg1, $arg2, $arg3, $arg4, $arg5)
. $arg1 $ExecutionContext.InvokeCommand.ExpandString("$arg2 $arg3 $arg4 > $arg5")
} -args $_.Command, $_.Arg1, $_.Arg2, $_.Arg3, $_.FName
}
与您的脚本一起发布
ComputerName
之前丢失了。 Invoke-Command
的参数具有一对一的映射。您正在函数中定义5个参数,但只能传递4个。Import-Csv $LogFolder\Machines.csv | ForEach-Object {
Invoke-Command ComputerName $_.Server {
param($Command, $Arg1, $Arg2, $Arg3, $FName)
$Command
} -Args $_.Arg1, $_.Arg2, $_.Arg3, $_.FName
# $_.Arg1 -> Command
# $_.Arg2 -> $Arg1
# $_.Arg3 -> $Arg2 .. and so on.
}
我正在使用$ExecutionContext.InvokeCommand.ExpandString
将所有参数组合在一起。由于此操作的目的是将多个字符串组合为一个字符串以创建单个字符串(每个元素外都没有引号),因此可以解决此问题。
您可以使用.
或&
来调用命令。
在执行中更新使用报价
Import-Csv $LogFolder| ForEach-Object {
# Limit the number of arguments sent via -args.
$Exe = $_.Command
# Use "" to parse it as " within your script.
$arguments = "$($_.arg1) $($_.arg2) ""$($_.arg3)"" > $($_.fname)"
Invoke-Command -ComputerName $_.Server -ScriptBlock {
param($command, $arguments)
. $command $arguments
} -args $exe, $arguments
}
答案 1 :(得分:0)
这是一个例子:
$arg1 = 'cmd'
$arg2 = '/c'
$arg3 = 'dir'
$server = 'comp001'
invoke-command -computername $server { param($a,$b,$c)
& $a $b $c} -args $arg1,$arg2,$arg3