【问题标题】:Getting Error in Powershell script while invoking exe file调用 exe 文件时在 Powershell 脚本中出错
【发布时间】:2014-11-05 09:56:39
【问题描述】:

我想从具有可变驱动器名称的驱动器调用 exe 文件。 该代码首先在系统的每个驱动器中搜索路径,一旦找到它就会进入我要调用命令-bpimagelist的If条件。

下面是给出异常错误的代码。

for($pat=67 ;$pat -le 87 ;$pat++)
{
 $y = [char]$pat;
$path = $y+":\Veritas\Netbackup\bin\admincmd"
If((Test-Path $path))
{
Write-Host $path "is found in" $y "drive"
Invoke-Item $y":\Veritas\Netbackup\bin\admincmd\bpimagelist -client abc.ge.com -d 11/01/2014 -U"
break
}
Else
{
continue
}
}

错误:

PS C:\Documents and Settings\abala\Desktop> .\veritasscript.ps1
D:\Veritas\Netbackup\bin\admincmd is found in D drive
Invoke-Item : Cannot find path 'C:\Veritas\Netbackup\bin\admincmd\bpimagelist -
client hclinnobpm01.jnj.com -d 11\01\2014 -U' because it does not exist.
At C:\Documents and Settings\admin_broy5\Desktop\veritasscript.ps1:8 char:17
+      Invoke-Item  <<<< $y":\Veritas\Netbackup\bin\admincmd\bpimagelist -clien
t hclinnobpm01.jnj.com -d 11/01/2014 -U"

================================================ ==

我不确定为什么当 $y 的当前值为 D 并且在 Write-Host 行中它打印为在 D 驱动器中找到的路径时错误显示 C:\Veritas。 有人可以建议一种方法来调用上面的 exe 文件吗?

【问题讨论】:

  • 是的,它确实存在于 D 盘中,这就是为什么输出的第一行是 - “D 盘中找到 D:\Veritas\Netbackup\bin\admincmd”
  • 不,先生,即使在 TestPath 中包含 bpimagelist 也不起作用。出于测试目的,目前我正在尝试使用以下代码调用位于 C:\Windows\syste32 的 fsutil.exe,但即使这样也不起作用。 Invoke-Expression "volume diskfree "$y":" 有什么建议吗?

标签: powershell


【解决方案1】:

更好的方法是使用Start-Process 而不是调用命令之一。

这是一个例子:

Start-Process "$y:\Veritas\Netbackup\bin\admincmd\bpimagelist" -argumentList @("-client abc.ge.com","-d 11/01/2014","-U")

如果这引发同样的错误,您应该检查机器是否确实存在 bpimagelist。

有关使用 powershell 运行可执行文件的更多信息,请查看Technet Wiki

【讨论】:

  • 明天当我在 Prod 环境中到达办公室时,我将尝试 Start-Process。同时在家里,我正在尝试使用 Invoke-Expression 中的可变驱动器名称调用简单的 fsutil.exe,它现在可以与 arco444 的有用回复一起使用。但这不是我的要求。我想调用 bpimagelist,它在表达式中几乎没有开关,我不确定它是否会起作用。我明天试试,然后在这里发布。谢谢
【解决方案2】:

当您使用 Invoke-Item 时,您使用了错误的 cmdlet

将其更改为Invoke-Expressioniex

Invoke-Expression "$($y):\Veritas\Netbackup\bin\admincmd\bpimagelist -client abc.ge.com -d 11/01/2014 -U"

【讨论】:

  • 即使这样也行不通。对于一个简单的测试,我正在尝试调用 windows fsutil 文件: Invoke-Expression "fsutil volume diskfree "$y":" 但即使这样也不起作用。以下错误:调用表达式:找不到接受参数“C:”的位置参数。
  • 非常小心该命令,因为冒号。应该是:Invoke-Expression "fsutil volume diskfree $($y):"
  • 事实上,我在尝试你粘贴的命令时也遇到了同样的错误,所以你错了。在您确定它不起作用之前,我会在您的问题中使用完整的命令进行测试
  • 感谢 Arco444,这确实可以正常工作,没有错误。所以我发现的问题是,如果 Invoke-Expression 中有一个变量,我们需要使用 $ 两次让 shell 理解它是一个变量。我说的对吗?
  • 是的,准确。我什至在自己的回答中错过了这一点..!已更新以反映这一点。
猜你喜欢
  • 2011-06-06
  • 1970-01-01
  • 2015-08-02
  • 1970-01-01
  • 1970-01-01
  • 2019-04-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多