2015-02-05 203 views
1

我在变量(脚本参数)%2中有一个路径。 我需要执行以下操作:在Windows批处理文件中使用PowerShell命令的输出

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

有人告诉我,这可能会在PowerShell中进行(因为我已经试过单独批处理文件去和悲惨地失败了)这里是想什么,我一个伪代码表示,以实现:

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

任何想法如何正确写入? 谢谢。

+0

你能给我一些假文件夹名称的例子吗?我在使用%2后很难跟踪您。批处理脚本并不是我的强项,而PowerShell则是。 – FoxDeploy 2015-02-05 14:41:29

+0

对不起,但这对我没用。就像你一样,我可以在PowerShell中编写代码,而不是批处理。我需要编写批处理命令,以便它可以在批处理脚本中使用%2和全部文件。 – Shaggydog 2015-02-05 14:53:13

+0

您无法从PowerShell中运行robocopy的任何原因。理论上你可以使用批量FOR语句从powershell获得输出,但为什么?例如$ leaf =(split-path%2 -leaf); robocopy%2 \ somepath \ $叶 – 2015-02-05 14:55:55

回答

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 =驱动
  • P =路径
  • N =名称
  • X =分机号

它通常用于文件,而不是目录;但它无论如何也适用于目录。在控制台窗口中查看for /?的最后几页,获取完整的详细信息。

+0

谢谢,这终于奏效了(第二个选项)。我不知道它如何或为什么起作用,而且我一直在为此奋斗几个小时。另外,在你的第一个例子中,为什么robocopy是powershell命令的一部分? – Shaggydog 2015-02-05 15:02:40

+0

@Shaggydog你的问题最初是由'robocopy'格式化的,与'split-path'在同一行。我没有足够关注这是否是有效的PowerShell-ese。编辑。 – rojo 2015-02-05 15:04:11

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" 
相关问题