【问题标题】:Using output from a PowerShell command in a windows batch file在 Windows 批处理文件中使用 PowerShell 命令的输出
【发布时间】:2015-02-05 14:35:27
【问题描述】:

我在变量(脚本参数)%2 中有一个路径。 我需要执行以下操作:

  1. 将叶子(路径中的最后一个文件夹)提取到变量中。
  2. 运行以下命令:robocopy %2 \\somepath\%leaf

有人告诉我这可以在 PowerShell 中完成(因为我尝试单独使用批处理文件但失败得很惨)这是我想要实现的伪代码表示:

set leaf = powershell -command (split-path %2 -leaf)
robocopy %2 \\somepath\%leaf

知道如何正确地写这个吗? 谢谢。

【问题讨论】:

  • 你能举个例子吗?我很难跟踪你对 %2 的使用。批处理脚本不是我的强项,而 PowerShell 是。
  • 我很抱歉,但这对我没有用。就像你一样,我可以在 PowerShell 中编码,而不是 Batch。我需要编写批处理命令,以便它可以在我的批处理脚本中工作,包括 %2 和所有。
  • 任何您无法从 powershell 中运行 robocopy 的原因。从理论上讲,您可以使用批处理 FOR 语句从 powershell 获取输出,但为什么呢?例如$leaf = (分割路径 %2 -leaf); robocopy %2 \somepath\$leaf

标签: powershell batch-file command


【解决方案1】:

当您想将批处理变量设置为命令的输出时,请使用for /f。这是一个例子:

@echo off
setlocal

set "psCommand=powershell -command "(split-path '%~2' -leaf)""
for /f "delims=" %%I in ('%psCommand%') do set "leaf=%%I"

echo %leaf%

但这是检索路径的最后一个文件夹的一种非常低效的方法。您应该执行以下操作,而不是调用 PowerShell:

@echo off
setlocal

for %%I in ("%~2") do set "leaf=%%~nxI"

echo %leaf%

%%~dpnxI 符号得到

  • d = 驱动器
  • p = 路径
  • n = 名称
  • x = 扩展

它传统上用于文件,而不是目录;但无论如何,它对于目录也同样有效。在控制台窗口中查看for /? 的最后几页以了解完整的详细信息。

【讨论】:

  • 谢谢,终于成功了(第二个选项)。我不知道它是如何或为什么起作用的,我已经为此奋斗了好几个小时。另外,在您的第一个示例中,为什么 robocopy 是 powershell 命令的一部分?
  • @Shaggydog 您的问题最初是用robocopy 格式化的,与split-path 在同一行。我没有足够关注这是否是有效的 PowerShell-ese。已编辑。
【解决方案2】:
FOR %%a IN ("%~2") DO FOR %%b IN ("%%~dpa.") DO ECHO %%~nxb

批量单行。取参数(这里是第二个参数),删除所有引号并重新应用它们。选择驱动器和路径,添加“。”然后选择需要叶子的结果的名称和扩展名。

显然,如果您需要在变量中使用它,

FOR %%a IN ("%~2") DO FOR %%b IN ("%%~dpa.") DO set "leaf=%%~nxb"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 2019-11-15
    • 1970-01-01
    • 2017-11-22
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    相关资源
    最近更新 更多