在 windows 批处理文件中使用 PowerShell 命令的输出

Using output from a PowerShell command in a windows batch file

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

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

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

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

知道如何正确编写吗? 谢谢。

只要您想将批处理变量设置为命令的输出,请使用 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 = 扩展名

它传统上用于文件,而不是目录;但无论如何它对目录也同样有效。有关完整详细信息,请参阅控制台 window 中 for /? 的最后几页。

FOR %%a IN ("%~2") DO FOR %%b IN ("%%~dpa.") DO ECHO %%~nxb

批量单行。获取参数(这里是第二个参数),删除所有引号并重新应用它们。 Select 驱动器和路径,添加'.'然后 select 需要制作 leaf 的结果的名称和扩展名。

显然,如果您在变量中需要这个,

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