- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试使用 invoke-command
在远程机器上执行代码。该方法的一部分包括一个 ScriptBlock
参数,我感觉我做的事情不正确。
首先,我尝试在脚本中创建一个方法,如下所示:
param([string] $filename)
function ValidatePath( $file, $fileType = "container" )
{
$fileExist = $null
if( -not (test-path $file -PathType $fileType) )
{
throw "The path $file does not exist!"
$fileExist = false
}
else
{
echo $filename found!
$fileExist = true
}
return $fileExist
}
$responseObject = Invoke-Command -ComputerName MININT-OU9K10R
-ScriptBlock{validatePath($filename)} -AsJob
$result = Receive-Job -id $responseObject.Id
echo $result
要调用它,我会执行 .\myScriptName.ps1 -filename C:\file\to\test
。该脚本将执行,但不会调用该函数。
然后我想也许我应该把这个函数放到一个新的脚本中。这看起来像:
文件 1:
$responseObject = Invoke-Command -ComputerName MININT-OU9K10R -ScriptBlock {
.\file2.ps1 -filename C:\something } -AsJob
$result = Receive-Job -id $responseObject.Id
echo $result
文件 2:
Param([string] $filename)
这些方法都不会执行该功能,我想知道为什么;或者,我需要做什么才能让它发挥作用。
function ValidatePath( $file, $fileType = "container" )
{
$fileExist = $null
if( -not (test-path $file -PathType $fileType) )
{
throw "The path $file does not exist!"
$fileExist = false
}
else
{
echo $filename found!
$fileExist = true
}
return $fileExist
}
最佳答案
那是因为 Invoke-Command 在远程计算机上执行脚本 block 中的代码。远程计算机上未定义 ValidatePath 函数,那里不存在脚本文件 file2.ps1。没有任何东西可以让远程计算机访问执行 Invoke-Command 的脚本中的代码或运行脚本的计算机上的文件。您需要将 file2.ps1 复制到远程计算机,或者为它提供 UNC 路径以在您的计算机上共享文件,或者将 ValidatePath 函数的内容放在脚本 block 。请务必将 $file 的所有实例更改为 $filename 或相反,并调整代码以交互方式运行,例如您将消除 $fileExist 和 return 语句。
要将路径验证代码放入传递给远程计算机的脚本 block 中,您需要执行如下操作:
$scriptblock = @"
if (-not (Test-Path $filename -PathType 'Container') ) {
throw "The path $file does not exist!"
} else {
echo $filename found!
}
"@
$responseObject = Invoke-Command -ComputerName MININT-OU9K10R -ScriptBlock{$scriptblock} -AsJob
N.B. 确保 "@ 没有缩进。它必须在行的开头。
顺便说一句,虽然这没有实际意义,但在 throw 语句之后立即设置变量有什么意义呢?一旦抛出错误,该函数就会终止。 $fileExist = false
在任何情况下都不会执行。您可能想使用 Write-Error。
关于.net - Powershell ScriptBlock 不执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17583103/
我并不是要让这个问题听起来太可爱,但这确实是眼前的问题。考虑安装在 $env:PSModulePath 下的 PowerShell 模块 Test.psm1 中定义的以下两个函数: function
我在 Scriptblock 参数中运行多个命令时遇到问题。所有文档都指向使用分号来分隔 cmdlet。使用通过分号分隔 cmdlet 的相同方法在我的本地机器上工作,但不能通过 invoke-com
我无法理解 ScriptBlock 中的范围s。我指望某种类似闭包的系统,但我似乎无法让它工作。 我有一个 ScriptBlock这需要 param并返回另一个 ScriptBlock : $sb1
我正在尝试找到一些在 PowerShell 中灵活更改/替换管道元素的方法: Function Where-DirectlyReportsTo { Param ( [Param
我写了以下代码: cls function GetFoo() { function GetBar() { $bar = "bar" $bar }
运行以下代码会产生错误,因为用于 path 的变量虽然在脚本中定义,但被解析为 null 事件: $ServerName = "test01" $RemotePath = "C:\Test\" $Te
我的程序执行用户指定的脚本 block ,我希望它以增量方式返回其输出(例如,如果脚本 block 运行很长时间)。 但是,ScriptBlock 的 API 似乎没有公开任何与管道相关的内容! 它有
PowerShell ScriptBlock 不是 lexical closure因为它不会关闭在其声明环境中引用的变量。相反,它似乎利用了在运行时绑定(bind)在 lambda 表达式中的动态范围
我正在尝试通过在文件中添加基于递增计数器的前缀来重命名文件,例如: $directory = 'C:\Temp' [int] $count=71; gci $directory | sort -Pro
我试图弄清楚 ScriptBlock.GetNewClosure() 是如何工作的。基于this线程(请参阅 Stej 的答案)我有以下代码: $i = 1 $block1 = { $i }
我的 powershell 脚本有一个 GUI。如果 C: 中的文件夹“Temp”不存在 - 创建文件夹并记录条目“Path C:\Temp 不存在 - 创建文件夹”。 这是我的代码的摘录: $inf
我的 powershell 脚本有一个 GUI。如果 C: 中的文件夹“Temp”不存在 - 创建文件夹并记录条目“Path C:\Temp 不存在 - 创建文件夹”。 这是我的代码的摘录: $inf
我有一个脚本,它有一些函数,然后在使用这些函数的同一个脚本中有多个作业。当我开始一份新工作时,它们似乎无法在 [ScriptBlock] 中访问。我有我的工作。 这是一个演示这一点的最小示例: # A
我正在尝试使用 invoke-command 在远程机器上执行代码。该方法的一部分包括一个 ScriptBlock 参数,我感觉我做的事情不正确。 首先,我尝试在脚本中创建一个方法,如下所示: par
我正在编写通用的 powershell 脚本来在远程机器上执行部署。我遇到了一个不能超限的问题,这个问题是关于在 Scriptblock 中由 ArgumentList 传递的带双引号的参数 我有这样
我正在尝试在 PowerShell ISE 中自动创建一堆选项卡 我已经开始使用一个函数,例如 function Start-NewTab($name, [ScriptBlock]$scriptBlo
我正在尝试更改 ScriptBlock 中的变量。我做错了什么? $reader=(New-Object System.Xml.XmlNodeReader $xaml) $Window=[Window
我有一个文件,我正在使用 PowerShell 4.0 从一台计算机传输到另一台计算机.我创建了一个读取缓冲区,将其转换为 Base64String,然后打开一个新的 PSSession。最后,我将这
我正在编写一个 PowerShell 脚本,它将使用 Invoke-Command 在远程主机上执行命令及其 -ScriptBlock 参数。例如, function Foo { ...
我有以下代码。 function createZip { Param ([String]$source, [String]$zipfile) Process { echo "zip: $source`
我是一名优秀的程序员,十分优秀!