首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在PowerShell中运行CMD任务?

如何在PowerShell中运行CMD任务?
EN

Stack Overflow用户
提问于 2022-09-20 18:27:40
回答 1查看 51关注 0票数 0

我试图在一个PowerShell脚本中运行一个CMD任务,该脚本将在Google中打开一个新的选项卡。我正在Azure DevOps管道中运行这个命令。

我试图运行的任务是:

代码语言:javascript
复制
start chrome --user-data-dir="ChromeProfiles\Profile$profile" --disable-default-apps --new-window "$($reportHtmlFile)"

当我从本地命令提示符运行此命令时,将打开一个新的选项卡,并按预期的方式工作。要从我的PowerShell窗口运行它,我运行:

代码语言:javascript
复制
cmd /c echo start chrome --user-data-dir="ChromeProfiles\Profile$profile" --disable-default-apps --new-window "$($reportHtmlFile)" | cmd.exe

但是,上述两个命令都可以正常工作,试图从Azure DevOps运行它们--我收到了一个错误消息:

代码语言:javascript
复制
+ ... " --disable-default-apps --new-window "$($reportHtmlFile)"" | cmd.exe
+                                           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The string is missing the terminator: ".
At D:\Agent\instance01\Workspace\20\s\pbi-load-test-tool\Run_Load_Test_Only.ps1:59 char:1
+ 
Missing closing ')' in expression.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : TerminatorExpectedAtEndOfString

我尝试了以下几点:

代码语言:javascript
复制
"start chrome --user-data-dir="ChromeProfiles\Profile$profile" --disable-default-apps --new-window "$($reportHtmlFile)"" | cmd.exe

& "start chrome --user-data-dir="ChromeProfiles\Profile$profile" --disable-default-apps --new-window "$($reportHtmlFile)" | cmd.exe"

是语法错误还是Azure DevOps的缺点?

EN

回答 1

Stack Overflow用户

发布于 2022-09-20 18:48:27

怎么回事:

你的论点被搞砸了,因为它们包含了引号。

当您以现在运行它的方式运行它时,PowerShell将尝试在将其传递给exe之前处理参数中的引号。

解决方案:使用飞溅

Splatting是PowerShell语言的一部分,它允许将结构化参数传递给命令。您可以使用[Hashtable]来提供命名参数(如果您正在调用函数或cmdlet)。您还可以使用[Object[]]来提供位置上的参数。

  1. 从所有参数中创建一个数组:

就你而言,这将是:

代码语言:javascript
复制
$startArgs = @(
    # The user-data-dir probably wants double quotes
    # so we use backticks to embed them.
    "--user-data-dir=`"ChromeProfiles\Profile$profile`""
    '--disable-default-apps'
    '--new-window'
    "$($reportHtmlFile)"
)

  1. 调用splatting:

代码语言:javascript
复制
start @startArgs

这样做将确保每个参数按照您希望的方式发送,并完全控制参数的引用方式。

另外:避免使用$profile

$profile是PowerShell中指向PowerShell配置文件的自动变量的名称。我怀疑您对铬配置文件感兴趣,而不是对PowerShell配置文件感兴趣,所以我会选择一个不同的变量名来更好地描述您的用途,而不是冒险让自动变量提供糟糕的结果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73791154

复制
相关文章

相似问题

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