Я пытаюсь написать сценарий, который собирает список имен серверов, затем выполняет итерацию через каждое имя сервера и захватывает вторую в новейшую папку в каталоге , переименовывает его и копирует на другой сервер. У меня возникают проблемы с тем, чтобы это работало все в одной команде, и я не уверен, что это лучший способ разделить его и заставить его работать правильно. Я получаю ошибки при попытке разных вещей, основной - «rename-item: невозможно оценить параметр« NewName », потому что его аргумент указан как блок сценария, и нет ввода». Вот фрагмент кода, который вызывает эту ошибку:Powershell: Get-ChildItem - piping to Rename-Item and Copy-Item
$serverNames = Get-Content -Path "C:\servers.txt"
foreach ($serverName in $ServerNames) {
$reportServer = "a56741035"
Get-ChildItem "\\$($serverName)\d$\mposlogs\device" | where { $_.PSIsContainer } | Sort CreationTime -Descending | Select -Skip 1 | Select -First 1 | Rename-Item -NewName { "$serverName" + "_" + $_.Name } | Copy-Item $_.FullName -Destination "\\$($reportServer)\c$\temp\mpos\logs" }
Другой «не может связать аргумент параметра„Путь“, поскольку он является недействительным». Вот код, который вызывает эту ошибку:
$serverNames = Get-Content -Path "C:\servers.txt"
foreach ($serverName in $ServerNames) {
$reportServer = "a56741035"
Get-ChildItem "\\$($serverName)\d$\mposlogs\device" | where { $_.PSIsContainer } | Sort CreationTime -Descending | Select -Skip 1 | Select -First 1 | ForEach-Object { Rename-Item -NewName { "$serverName" + "_" + $_.Name } | Copy-Item $_.FullName -Destination "\\$($reportServer)\c$\temp\mpos\logs" } }
Я чувствую, что я очень близко и просто ничего не вижу. Любая помощь очень ценится, большое вам спасибо. Хорошего дня.
отредактирован СОДЕРЖАТЬ КОД: НОВЫЕ
Get-ChildItem "\\$($serverName)\d$\mposlogs\device" | where { $_.PSIsContainer } | Sort CreationTime -Descending | Select -Skip 1 | Select -First 1 | ForEach-Object { Rename-Item -Path $_.FullName -NewName ("$serverName" + "_" + $_.Name) ; Copy-Item $_.FullName -Destination "\\$($reportServer)\c$\temp\mpos\logs" }
ПРАВИЛ НОВЕЙШИХ КОММЕНТАРИИ:
Get-Child-Item "\\$serverName\d$\mposlogs\device" | where {$_.PSIsContainer} | Sort CreationTime -Descending | Select -Skip 1 | Select -First 1 | ForEach-Object { Rename-Item -Path $_.FullName -NewName ("$serverName" + "" + $.Name) ; Copy-Item ("$serverName" + "" + $.Name) -Destination "\\$reportServer\c$\temp\mpos\logs" }
Я думаю, что это очень близко к прибиванию! Единственная часть, которую он не выполняет, - это копия файла. Это не ошибка ... он просто не копирует файл. :) Есть идеи? Спасибо! – LilithGoddess
oh wow yea не видел, как там был установлен конвейер, проблема в том, что 'rename-item' не передает объект через' Copy-Item', вы можете преодолеть два способа: либо добавить ' -PassThru' переключится на ваш «Переименовать-элемент» или просто измените ваш '|' на ';', который затем обработает копию в качестве второй команды для выполнения в foreach, а не в элементе конвейера –
ПОЛУЧИТЬ ТАК ЗАКРЫТЬ !! ! Теперь кажется, что он переименовывает файл, но затем пытается скопировать файл до его переименования? (не может найти путь xxxxx, потому что его не существует) - и когда я смотрю на папку, он был переименован правильно, но ошибка на самом деле вызывает папку до ее переименования ... это имеет смысл? – LilithGoddess