【问题标题】:passing CMD arguments to Powershell将 CMD 参数传递给 Powershell
【发布时间】:2022-01-05 06:56:30
【问题描述】:

这里是代码:

@echo off
if "%*"=="" (echo Give me the URL! && exit /b)
echo Output :
set /p output=
powershell Invoke-WebRequest -Uri %* -OutFile output

我写的这段代码的问题是输出变量
如何将该变量发送到powershell?

【问题讨论】:

  • if "%*"=="" (echo Give me the URL! && exit /b) 如果有多个参数字符串传递给包含在" 中的批处理文件,则会导致语法错误。 IF 条件还会导致批处理文件处理退出并显示错误消息,因为语法错误即使仅将一个参数字符串(url 包含在" 中)传递给批处理文件如果 url 包含 url 经常包含的 & 或 =,则它是必要的。圆括号在这里完全没用,留给&&的空格也被echo输出为尾随空格。
  • 无条件运算符 & 而不是条件运算符 && 就足够了。 echo 在这里永远不会失败,因此永远不会以不等于零的代码退出。我强烈建议将此命令行修改为if "%~1" == "" echo Run "%~nx0" with a URL!& exit /B。接下来的两行可以合并到set /P "OutputFile=Output file: "。然后可以使用'"%OutputFile:~"=%"' 引用环境变量OutputFile,从而您需要希望用户真正输入文件名,而不是任何内容或与有效文件名完全不同的东西。
  • 我建议阅读我在How to stop Windows command interpreter from quitting batch file execution on an incorrect user input? 上的长答案,它通过示例解释了在批处理文件中使用set /P "variable=prompt text" 可能发生的情况,无需额外代码以安全可靠的方式验证用户输入。
  • 但我不明白为什么要使用由 Windows 命令处理器 cmd.exe 处理的批处理文件,这是 Windows 默认情况下可用的最有限的脚本解释器,用于参数字符串验证和非常不安全和不安全的用户提示并运行其专用的继任者 PowerShell,它是一个更强大的脚本解释器。为什么不使用 PowerShell 完成整个任务?与cmd.exe 处理的批处理文件代码和powershell.exe 处理的PowerShell cmdlet 的组合相比,使用PowerShell 脚本可以完成所有工作。

标签: powershell batch-file cmd


【解决方案1】:

使用%output% 扩展output 变量 - 并记住引用参数(否则如果有人输入带有空格的路径,它将中断):

@echo off
if "%*"=="" (echo Give me the URL! && exit /b)
echo Output :
set /p output=
powershell Invoke-WebRequest -Uri '%*' -OutFile '%output%'

【讨论】:

    猜你喜欢
    • 2020-11-26
    • 2018-09-29
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 2019-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多