【问题标题】:How to call a batch file with parameters from a command prompt如何从命令提示符调用带有参数的批处理文件
【发布时间】:2017-11-30 03:28:25
【问题描述】:

下面是我的 power shell 脚本中调用批处理文件(带参数)的行,我得到一个位置参数错误。

有人可以帮助您了解如何使用 powershell 脚本中的参数调用批处理文件以及如何从批处理文件中捕获该输入参数。谢谢

我的 Power shell 脚本中的行:

启动进程 "cmd.exe" "/c D:\load.bat" "$Password"

--Error:
**PS D:\Oracle\Scripts\Obi> .\XYZ.ps1
Start-Process : **A positional parameter cannot be found that accepts argument 'password'.**
At D:\.ps1:4 char:1
+ Start-Process "cmd.exe" "/c D:\load.bat"  "$Password"
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Start-Process], ParameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.StartProcessCommand**

批处理文件 (load.bat) 中的脚本:

set "Var=%1"
for %%i in (*.csv) do (
    sqlldr USERID=userid/%Var%@server:prot/domain, CONTROL=control.ctl, LOG=logfile.log,ERRORS=9999 data='%%i' direct='true'
    move %%i D:\backup
)

【问题讨论】:

  • 为什么需要批处理文件?只需直接从 PowerShell 运行您想要的命令。
  • 我需要批处理,因为它会触发一系列 sql 过程和函数。将所有内容转换为PS将是一项艰巨的任务。有没有办法从我的 PS 调用批处理?
  • 您可以将批处理文件作为可执行文件运行
  • 下面也用过
  • Start-Process "D:\load.bat" $PasswordStart -Process:ID 为 391020 的进程未运行。在 D:\Oracle\Scripts\Obi\OBIEE_Load_Process.ps1:4 char:1 + Start-Process "D:\load.bat" $Password + ~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [开始-进程],ArgumentException + FullyQualifiedErrorId : System.ArgumentException,Microsoft.PowerShell.Commands.StartProcessCommand

标签: powershell batch-file


【解决方案1】:

要从 PowerShell 提示符运行批处理文件(cmd.exe shell 脚本),只需键入批处理文件的名称,后跟其参数,然后按 Enter。请记住:PowerShell 是一个 shell,这意味着它运行您键入的命令,就像 cmd.exe 一样。例如:

D:\load.bat [param1 [param2 [...]]

与cmd.exe 的一个区别是,如果您要运行的命令包含空格,请将命令括在引号中并使用&(调用或调用)运算符调用它。例如:

& "D:\Script Tools\load.bat" [param1 [param2 [...]]

就像cmd.exe一样,如果参数包含空格,不要忘记引用它。

【讨论】:

    【解决方案2】:

    你应该可以跑了:

    D:\load.bat "$Password"
    

    或者:

    cmd.exe /c D:\load.bat "$Password"
    

    但是,您也应该能够运行:

    Start-Process -FilePath 'C:\Windows\System32\cmd.exe' -ArgumentList '/c', 'D:\load.bat', "$Password"
    

    请注意,/c 和 'D:\load.bat' 被视为单独的参数。

    如果您想隐藏窗口 (-WindowStyle Hidden) 或强制 PowerShell 等待脚本完成 (-Wait),Start-Process 会很有用。如果您需要从批处理文件返回的值,您可能需要-PassThru 参数。

    【讨论】:

      【解决方案3】:

      如有疑问,请阅读并关注Start-Process documentation。

      start-process cmd.exe -ArgumentList "/c", "D:\load.bat", "$password"
      

      上面会假设$password变量不包含cmd有毒字符(见Redirection)像

      & Ampersand
      < Less-Than Sign
      > Greater-Than Sign
      | Vertical Line
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多