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

时间:2015-02-05 14:35:28

标签: powershell batch-file command

我在变量(脚本参数)%2中有一个路径。 我需要做以下事情:

  1. 将叶子(路径中的最后一个文件夹)提取到变量。
  2. 运行以下命令:robocopy %2 \\somepath\%leaf
  3. 有人告诉我这可以在PowerShell中完成(因为我已经尝试单独使用批处理文件并且失败了)这里是我想要实现的伪代码表示:

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

    知道怎么写这个吗? 谢谢。

2 个答案:

答案 0 :(得分:2)

每当您想要将批处理变量设置为命令的输出时,请使用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 = drive
  • p =路径
  • n = name
  • x = extension

它传统上用于文件而不是目录;但它无论如何都适用于目录。有关详细信息,请参阅控制台窗口中for /?的最后几页。

答案 1 :(得分:0)

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"