$pathlist = Get-Content C:\Test\pathlist.txt
$pathlist | ForEach-Object {
$outFile = 'C:\Test\Output\computername_{0}.txt' -f $_ -replace ':?\\', '_'
Get-ChildItem -LiteralPath $_ -Recurse -Name > $outFile
}
Я заменил несколько вызовов метода .Replace()
одним вызовом на основе регулярных выражений на оператор -replace
PowerShell .
Я заменил конкатенацию строк (+
) одним вызовом Оператор формата PowerShell , -f
.
I 'мы заменили Out-File
на >
для краткости.
- Я добавил
-Name
к вызову Get-ChildItem
, чтобы строки пути относительно пути ввода былибыть выходом;если вам нужны абсолютные пути, используйте
(Get-ChildItem -LiteralPath $_ -Recurse).FullName > $outFile
(или
Get-ChildItem -LiteralPath $_ -Recurse | Select-Object -ExpandProperty FullName > $outFile
).
Что касается то, что вы пытались :
Ваша проблема заключалась в том, что вы не обернули выражение , которое построило целевое имя файла с помощью конкатенации строк в (...)
, что необходимо, если вы хотите использовать выражениев качестве команды аргумент .
Обратите внимание:
- внутри выражения строковые литералы должны быть (полностью) заключены в кавычки
$(...)
нужен только если вам нужно обернуть несколько операторов;в противном случае, если необходимо переопределить стандартный приоритет оператора , используйте (...)
.
Таким образом, ваша исходная команда может быть исправлена с помощью:
... | Out-File ('C:\Test\Output\computername_' + $_.replace("\","_").replace(":","") + '.txt')