【问题标题】:Running a command with arguments assistance运行带有参数帮助的命令
【发布时间】:2020-08-12 16:49:28
【问题描述】:

我有一个以静默模式运行程序的命令,它使用 XML 文件作为数据存储库,并使用 word 模板根据过滤器 xml 文件创建多个 word 文档。

我使用的命令是:

"P:\ath to\executable" -Username:Admin -Password:Pa55w0rd -Datadefinition:"C:\Data.xml" -Datafilter:"C:\Filter.xml" -wordtemplate:"C:\Batch\Paul1.dotx" -Targetdocument:="C:\Batch\Paul1.pdf" -filetype:PDF -Log:"C:\Logs\error.log"  -Usage:DOCGENSILENT

我需要将它作为我主要管理的 PowerShell 脚本运行:

set-executionpolicy unrestricted  

$datadefinition = Get-Content "C:\Data file.xml"
$datafilter = Get-Content "C:\Filter for data file.xml"
$wordTemplate = Get-Content "C:\"C:\Template\Paul1.dotx"
$targetFolder = Get-Content "C:\"C:\Paul\Paul.pdf"

Stop-Job = "Executable path" -Username:Admin -Password:Pa55w0rd -Datadefinition:%dataDefinition% -Datafilter:%dataFilter% -wordtemplate:%wordTemplate% -Targetdocument:%targetFolder% -filetype:docx -Log:%logPath%  -Usage:DOCGENSILENT 

Stop-Job 1

set-executionpolicy restricted  

Write-Host -NoNewLine "Press any key to continue..."
$null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") 

我的问题是脚本启动了可执行文件但没有传递变量,谁能指导我正确的方向来解决这个问题?

【问题讨论】:

  • set targetFolder=.. 设置文件的路径。 $datadefinition = Get-Content 但是从文件中获取第一行作为内容。那么您似乎仍在 powershell 脚本中使用batch-file 变量? %dataFilter%
  • 所以摆脱Get-Content,只需将变量设置为$datadefinition = "C:\Data file.xml"等。将可执行路径中的变量更改为$dataDefinition而不是%dataDefinition%。另外,Stop-Job 的目的是什么,我没有看到与批处理文件中的内容有任何关系?最后,您当前的 batch-file 会覆盖您的 2 个变量。 wordTemplatetargetFolder 都会以 Paul1.* 结束。
  • 您的问题在技术上是关于从 PowerShell 运行带有参数/参数的命令,批处理文件和文件转换与您的问题无关。因此,我删除了您对batch-filefile-conversion 的引用。此外,我删除了批处理文件的内容,只提供了批处理文件正在运行的命令行。另外,你的路径字符串有两个错误,"C:\"C:\Template\Paul1.dotx",应该是"C:\Template\Paul1.dotx""C:\"C:\Paul\Paul.pdf",应该是"C:\Paul\Paul.pdf"
  • Stop-Job = 应该做什么?我非常怀疑它会启动一个带有参数的可执行文件。也许你想看看使用&start-process 代替。

标签: powershell command


【解决方案1】:

这项工作取决于您的可执行文件的行为。我注意到的一些事情:

  1. 不应该这样吗:

    $wordTemplate = Get-Content "C:\"C:\Template\Paul1.dotx"
    

    是这样的:

    $wordTemplate = "C:\Template\Paul1.dotx"
    

    您确定需要Get-Content 吗? (除此之外,您的示例中的路径和引用不正确。)

  2. 不应该这样吗:

    $targetFolder = Get-Content "C:\"C:\Paul\Paul.pdf"
    

    是这样的:

    $targetDocument = "C:\Paul\Paul.pdf"
    

    我怀疑Get-Content 在这里是否正确,因为大概您的输出文件还不存在?我还重命名了变量,以便在您的命令中更有意义。

  3. 事实上,您确定需要Get-Content 来处理其中的任何一个吗?你不是指定文件名,而不是文件的内容吗?

  4. 在 PowerShell 中,变量以 $ 为前缀,而不是被 % 包围。

  5. 使用Set-ExecutionPolicy within 一个脚本来使脚本运行是没有意义的,因为该脚本已经在运行。 (也就是说,如果执行策略阻止脚本执行,PowerShell 一开始就不会让你运行脚本。)

如果我对您的变量的猜测是正确的,我认为您的脚本应该看起来像这样(另请注意,我指定了一个 $logFile 变量,我在您的脚本中没有看到):

$datadefinition = "C:\Users\Administrator\data\Sample Model_146_object type(s).xml"
$datafilter = "C:\Users\Administrator\data\Sample Model_146_object type(s).xml"
$wordtemplate = "C:\Users\Administrator\Templates\Base object.docx"
$targetdocument = "C:\Users\Administrator\Result\sample test15"
$logfile = "C:\Users\Administrator\Logs\C4W Error.log"

& "C:\Program Files (x86)\Communicator4Word.exe" -Username:Admin -Password: -Datadefinition:$datadefinition -Datafilter:$datafilter -wordtemplate:$wordtemplate -Targetdocument:$targetdocument -filetype:docx -Log:$logfile -Usage:DOCGENSILENT

我不知道Communicator4Word.exe 在您使用-Password: 后没有密码时的行为。 (这是语法错误,还是应该完全省略 -Password:?)

【讨论】:

  • 感谢您的回复,我只是在学习 powershell,我们这些老狗不喜欢改变我们的方式,不幸的是,公司政策已经改变,MD 希望我们停止使用 Batch 和 Com 脚本,powershell看起来比 css 或 vscript 更容易转换,我会测试你的建议,让你知道我是怎么做的
  • 快速更新,如果我将命令设置为 & "P:\ath to\executable" 可执行程序启动,一旦我在可执行文件后添加连字符就会出错
  • 这是我得到的错误,我已经删除了用户名和密码,因为脚本正在使用登录用户运行。在 line:16 char:1 + -Datadefinition:$datadefinition -Targetdocument:$targetdocument -wordtemplate:$w ... + ~~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (- Datadefinition::String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException
  • 请使用您正在运行的 exact 脚本的复制和粘贴以及full and complete 的复制和粘贴来更新您的问题您收到的错误消息。 (请记住,我们看不到您的屏幕!)
  • 好的,这是我的完整脚本:
猜你喜欢
  • 2011-11-18
  • 2011-07-30
  • 2011-07-03
  • 1970-01-01
  • 2011-08-23
  • 1970-01-01
  • 2023-02-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多