Запустите команду с помощью PowerShell для каждого каталога с предполагаемым компонентом пути - PullRequest
1 голос
/ 30 сентября 2010

Я нашел этот вопрос , что очень похоже на то, что я хочу, но я просто не смог заставить его работать.

Я хочу запустить процесс.exe в каждом каталоге XML подкаталога C: \ ToProcess.Если бы я делал это вручную, первые 6 из 50 или около того команд выглядели бы так:

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 ]

6 голосов
/ 30 сентября 2010

Это должно работать. Он создаст каждый из целевых каталогов, если они не существуют, а затем запустит 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 голос
/ 30 сентября 2010

Должна ли это быть одна строка? Если вы можете сделать это в скрипте 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);
}

И, конечно, вам нужно будет затем запустить ваш process.exe в цикле foreach.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...