Переименовать файл перед копированием в определенную папку - PullRequest
1 голос
/ 14 июня 2019

Я новичок и учусь создавать сценарии PowerShell, чтобы упростить жизнь в ИТ.

В настоящее время я пытаюсь создать скрипт, который запускает определенный инструмент Microsoft, сканирует определенные сетевые ресурсы в CSV-файле и создает выходной файл JSON. Теперь, когда шаблон этого файла всегда такой же, как «Report_Username_Hostname.vba.JSON», я хотел бы добавить либо имя отсканированного каталога, либо даже диапазон чисел, например. "Report_Username_Hostname (100) .vba.JSON" или "Report_Username_Hostname (sharename) .vba.JSON"

Это необходимо, так как после этого шага переименования я загружаю этот и другие файлы в этой папке в другую папку на другом сервере, чтобы загрузить их в базу данных. Я планировал запустить этот сценарий в самых разных местах на самом автоматическом уровне, и все они скопировали свои собранные файлы только в одну папку загрузки.

Я уже пробовал несколько вариантов, которые нашел где-то в глубине интернета, но пришел только к точке, где файл был переименован в 0 или аналогичный, но не до ожидаемого результата.

Сценарий Powershell, выполняющий эту работу:

 $PSpath = 'C:\temp\FileRemediation\Scripts\'
 $Rpath = $PSpath +'..\Reports\1st'
 $localshare = $PSpath +'..\temp\1st'
 $csvinputs = Import-Csv $PSpath\fileremediation_1st.csv
 $uploadshare = '\\PGC2EU-WFSFR01.eu1.1corp.org\upload\'

# This section checks if the folder for scan reports is availabe and if not will create necessary folder.
If(!(test-path $Rpath))
{
      New-Item -ItemType Directory -Force -Path $Rpath
} 
If(!(test-path $localshare))
{
      New-Item -ItemType Directory -Force -Path $localshare
}
Set-Location $Rpath

# This section reads input from configuration file and starts Ms ReadinessReportCreator to scan shares in configuration file. 
ForEach($csvinput in $csvinputs)
{
    $uncshare = $csvinput.sharefolder

    $Executeable = Start-Process "C:\Program Files (x86)\Microsoft xxx\xxx.exe" `
    -Argumentlist "-p ""$uncshare""", "-r", "-t 10000", "-output ""$localshare"""`
    -Wait
   Get-ChildItem -Path $localshare -Filter '*.JSON' | Rename-Item     -NewName {$_.FullName+$uncshare}
}
# This section copies the output *.JSON file of the xxx to the share, where I they will be uploaded to DB.        
Get-ChildItem -Path $localshare -Filter '*.JSON' | Where {$_.Length -ge 3} | move-item -Destination '$uploadshare'

файлremediation_1st.csv выглядит как

sharefolder
\\server\sharename

Может кто-нибудь, пожалуйста, помогите мне в этом, я понятия не имею, что я делаю неправильно. Спасибо!

Текущая ошибка, которую я получаю

Rename-Item: невозможно переименовать указанную цель, поскольку она представляет путь или имя устройства. В C: \ temp \ FileRemediation \ scripts \ fileremediation_V2_1st.ps1: 28 char: 55 + ... поделиться -Filter '* .JSON' | Rename-Item -NewName {$ _. FullName + $ uncshare} + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo: InvalidArgument: (:) [Rename-Item], PSArgumentException + FullyQualifiedErrorId: Аргумент, Microsoft.PowerShell.Commands.RenameItemCommand

Как уже говорилось, мне также будет хорошо с выделенным диапазоном чисел, который добавляется к имени файла "Report_Username_Hostname (100) .vba.JSON" Идеальный мир был бы, если бы я мог отделить \ server \ sharename от csv-файла и добавить sharename к своему имени файла.

1 Ответ

0 голосов
/ 14 июня 2019

Я думаю, что проблема с:

Rename-Item -NewName {$_.FullName+$uncshare}

Ваш входной файл (Get-ChildItem) путь:

$PSpath = 'C:\temp\FileRemediation\Scripts\'
$localshare = $PSpath +'..\temp\1st'

Rename-Item использует $_.FullName, который разрешается примерно так:

C:\temp\FileRemediation\Scripts\..\temp\1st\MyFile.JSON

Переменные содержат:

$_.FullName = C:\temp\FileRemediation\Scripts\..\temp\1st\MyFile.JSON
$uncshare = "\\server\sharename"

Итак, Ваш Rename-Item ... $_.FullName+$uncshare попытается переименовать его в:

C:\temp\FileRemediation\Scripts\..\temp\1st\MyFile.JSON\\server\sharename

Неверный путь.

...