Powershell 如何将cmdlet输出作为参数传递给没有中间变量的应用程序(.exe)?

Powershell 如何将cmdlet输出作为参数传递给没有中间变量的应用程序(.exe)?,powershell,Powershell,我有以下返回字符串的PS命令: (get-date -Uformat %s).remove(10, 1).substring(5,9) 我想从当前目录调用应用程序myapp.exe,并将PS命令的结果作为参数,我想在一行中进行调用,不需要中间变量。它的语法是什么 换句话说,我正在bash中寻找一款售价为美元的Powershell等价物。我想您正在寻找: command ((get-date -Uformat %s).remove(10, 1).substring(5,9)) 但是,即使没有您

我有以下返回字符串的PS命令:

(get-date -Uformat %s).remove(10, 1).substring(5,9)
我想从当前目录调用应用程序myapp.exe,并将PS命令的结果作为参数,我想在一行中进行调用,不需要中间变量。它的语法是什么


换句话说,我正在bash中寻找一款售价为美元的Powershell等价物。

我想您正在寻找:

command ((get-date -Uformat %s).remove(10, 1).substring(5,9))
但是,即使没有

您也可以使用Invoke Expression,但是请记住,在使用此cmdlet时,需要考虑安全问题,因为它可能会使您面临代码注入攻击。还要注意的是,调用表达式通常会成功,即使底层命令失败并出现错误

$command = "myapp.exe '$((get-date -Uformat %s).remove(10, 1).substring(5,9))'"
Invoke-Expression $command
如果要检查命令是否成功,请检查$LASTEXITCODE以获得合适的exitcode,并在此基础上继续/失败。请注意,$LASTEXITCODE仅在检查程序结果时有效,而不是在检查cmdlet时有效

避免调用表达式 通过构建要传递给命令行应用程序的参数数组,可以避免使用Invoke表达式,就像在您的示例中一样,它将只是一个参数,但也可以扩展为构建具有多个参数的更复杂命令,只需为每个开关、参数或值添加额外的数组元素:

$cmdargs = @(
  ( GetDdate -Uformat %s ).Remove( 10, 1 ).Substring( 5,9 )
)
myapp.exe $cmdargs
您仍然可以通过检查$LASTEXITCODE的值来跟踪命令的成功

保持简单 在您的情况下,只需调用myapp.exe get date-Uformat%s.remove10,1.substring5,9,它将插入日期字符串作为参数。但是,当您想要基于许多条件构建更复杂的命令时,上述构建数组的技术是调用表达式的首选方法

./myapp.exe (get-date -Uformat %s).remove(10, 1).substring(5,9)
./myapp.exe或。\myapp.exe调用位于当前目录中的可执行文件myapp.exe

如果myapp.exe位于$env:PATH中列出的目录中,请不要使用。/\.\前缀。 无论哪种方式,结果进程都在当前目录文件系统提供程序位置运行。 传递给可执行文件的参数适合在参数模式下进行解析,请参见,给定的以空格分隔的参数的解释方式取决于其第一个字符:

因为第一个字符是,所以参数作为在表达式模式下解析的表达式进行计算;该表达式的计算结果将传递给可执行文件。 第一个位置中的其他特殊字符是$,@,以及',请参见下一点

请注意,$…-子表达式操作符see-在这种情况下也会起作用,如果只有一个表达式。。。将进行评估-$。。。仅当要传递多个语句的输出时才需要。 单引号“…”参数的内容被视为文字,而。。。简言之,参数是一个可扩展字符串,其中插入了带$前缀的标记

任何其他未加引号且基本上不以@或$开头的参数,都被隐式地视为可展开字符串,即,就好像您将其包含在….中一样

有关未显式包含在中的参数的全面概述。。。或者“…”是在参数模式下解析的,请参阅我的

有关此上下文中可能出现的意外行为,请参阅。
只是做试试看,找出答案。@theincorgible1:做什么?我已经在谷歌上搜索了至少15分钟,运气不好。我的意思是试试你的:myapp.exe。这不是一个问题,这是一个陈述,因为您还没有尝试过任何东西。添加另一组括号是不必要的。他当前的示例将按原样工作。是的,但一般来说是这样,尽管我同意你的观点,并在回答中添加了这一点,仅当你将命令的输出用作if-not Test Path-Path之类的表达式时。{获取进程{0}host'-f'svc'@VioletGiraffe我们在这个领域永远都在学习:一个严肃的问题是:Microsoft有关于powershell及其所有行为的优秀文档。如果您发现自己被困在引擎范围内的某个内容上,而不仅仅是一个cmdlet,我会查看关于*主题的“获取帮助”部分。很少有很好的理由使用Invoke Expression;它应该这样做必须避免,因为更健壮的解决方案通常是可用的,就像这里的情况一样,因为它能够调用作为字符串传递的任意命令,正如您所说的,这可能是一个安全风险。除非绝对必要,否则避免它是一个好习惯。在这里,目标表达式可以简单地按原样传递给目标执行者utable myapp.exe get date…。对于程序,您可以生成字符串并使用&$命令执行它们。但是对于cmdlet,我不知道有什么更好的方法可以有条件地生成命令,而不是生成字符串并使用Invoke Expression调用它。&也可以与cmdlet/function/script名称[引号中的字符串/存储在变量中]一起使用。Try&G
et日期,$cmd='Get Date';&$cmd,&获取日期。请注意,只有命令名/文件路径是&的参数,而参数通常是单独传递的。我不知道,我认为&是专门用于程序执行的。每天学习新的东西。很高兴听到。所有命令cmdlet、函数、脚本、外部程序、别名、脚本块的创建均与&和相同,脚本块除外,与直接调用相同。在这种情况下,建议调用表达式是一个坏主意,所以请考虑修改您的答案。