首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在远程计算机上使用调用命令时,字符串展开在PowerShell中不起作用

在远程计算机上使用调用命令时,字符串展开在PowerShell中不起作用
EN

Stack Overflow用户
提问于 2011-01-27 00:23:01
回答 3查看 4.1K关注 0票数 6

为什么第一个例子不等同于第二个例子?

1:

代码语言:javascript
运行
复制
$volumeNum = 2
Invoke-Command -ComputerName $IP -Credential $GuestVM -ScriptBlock {"select volume $volumeNum" | diskpart}

2:

代码语言:javascript
运行
复制
Invoke-Command -ComputerName $IP -Credential $GuestVM -ScriptBlock {"select volume 2" | diskpart}

为什么powershell不评估

“选择卷$volumeNum”

选择第2卷

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-01-27 00:33:42

通过Invoke-Command执行的脚本块没有访问当前环境状态的权限,它在单独的进程中运行。如果您正在本地计算机上运行该命令,则该命令将工作。

问题是,在远程计算机上执行字符串"select volume $volumeNum"之前,不会对其进行计算。因此,它正在寻找远程计算机上当前进程的环境中的值,并且没有在那里定义$volumeNum

PowerShell提供了一种通过Invoke-Command传递参数的机制。这从本地计算机到远程计算机都可以实现:

代码语言:javascript
运行
复制
Invoke-Command -ComputerName $ip -ScriptBlock { param($x) "hello $x" } -ArgumentList "world"

我相信类似的方法会适用于你:

代码语言:javascript
运行
复制
Invoke-Command -ComputerName $IP -Credential $GuestVM -ScriptBlock {param($volumeNum) "select volume $volumeNum" | diskpart} -ArgumentList $volumeNum
票数 7
EN

Stack Overflow用户

发布于 2011-01-27 00:43:55

脚本块被编译。这意味着它们中的变量引用在编译时是固定的。您可以通过将脚本块的创建推迟到运行时来解决这个问题:

代码语言:javascript
运行
复制
$sb = [scriptblock]::create("select volume $volumeNum | diskpart")
Invoke-Command -ComputerName $IP -Credential $GuestVM -ScriptBlock $sb
票数 3
EN

Stack Overflow用户

发布于 2011-01-27 06:46:49

其他人需要进一步注意:GetNewClosure也不起作用。

代码语言:javascript
运行
复制
$filt = "*c*"
$cl = { gci D:\testdir $filt }.GetNewClosure()
& $cl

# returns 9 items
Invoke-command -computer mylocalhost -script $cl
# returns 9 items
Invoke-command -computer mylocalhost -script { gci D:\prgs\tools\Console2 $filt }
# returns 4 items
Invoke-command -computer mylocalhost -script { gci D:\prgs\tools\Console2 "*c*" }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4811751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档