使用PowerShell在每个具有假定路径组件的目录上运行命令

时间:2010-09-30 03:16:06

标签: powershell

我发现this question非常与我想要的相似,但我无法让它发挥作用。

我想在C:\ ToProcess的每个子目录的XML目录上运行process.exe。如果我手动完成,50个左右的命令中的前6个看起来像这样:

process.exe -switch1 -switch2 -i "C:\ToProcess\abx\XML" -o "C:\Processed\abx\XML"
process.exe -switch1 -switch2 -i "C:\ToProcess\dez\XML" -o "C:\Processed\dez\XML"
process.exe -switch1 -switch2 -i "C:\ToProcess\ghm\XML" -o "C:\Processed\ghm\XML"
process.exe -switch1 -switch2 -i "C:\ToProcess\jkq\XML" -o "C:\Processed\jkq\XML"
process.exe -switch1 -switch2 -i "C:\ToProcess\mn0\XML" -o "C:\Processed\mn0\XML"
process.exe -switch1 -switch2 -i "C:\ToProcess\pq2\XML" -o "C:\Processed\pq2\XML"

但在运行这些命令之前,我必须这样做,因为目标文件夹尚不存在:

md "C:\Processed\abx"
md "C:\Processed\dez"
md "C:\Processed\ghm"
md "C:\Processed\jkq"
md "C:\Processed\mn0"
md "C:\Processed\pq2"
md "C:\Processed\abx\XML"
md "C:\Processed\dez\XML"
md "C:\Processed\ghm\XML"
md "C:\Processed\jkq\XML"
md "C:\Processed\mn0\XML"
md "C:\Processed\pq2\XML"

那么,有没有办法在几个命令中完成所有这些?

2 个答案:

答案 0 :(得分:6)

这应该有效。如果它们不存在,它将创建每个目标目录,然后在每个目录目录上运行process.exe。

Get-ChildItem C:\ToProcess\*\XML | ForEach-Object { 
    $newPath = $_.FullName.Replace("ToProcess","Processed"); 
    New-Item $newPath -ItemType Directory  -ErrorAction SilentlyContinue;   
    .\process.exe -switch1 -switch2 -i $_.FullName -o $newPath;
}

更新:在评论后的流程之前添加。\

答案 1 :(得分:1)

是否需要单行?如果您可以在PowerShell脚本中执行此操作,那么您可以执行以下操作:

foreach ($path in (get-childitem -recurse | foreach-object -process { if ($_.FullName.EndsWith("\xml")) {$_.FullName} }))
{
    $newpath = $path.Substring(0,$path.LastIndexOf("\xml"));
    $newpath = $newpath.Substring($newPath.LastIndexOf("\"));
    $newpath = "c:\processed" + $newpath + "\xml";
    [IO.Directory]::CreateDirectory($newpath);
}

当然,您需要在该foreach循环中执行您的process.exe。

相关问题