В основном я пытаюсь создать подпрограмму, которая читает каталог с именованной папкой, создает CSV-файл, затем читает этот CSV-файл, манипулирует некоторыми свойствами, чтобы разделить данные на новые столбцы, экспортирует их в другой CSV.
Этого я добился с помощью следующего кода:
$Folder = Read-Host 'Please enter a folder path'
$File = Read-Host 'Please enter a filename'
$OutputFile = $Folder + '\' + $File + '.csv'
$SplitFile = $Folder + '\' + $File + '_Split.csv'
$CopyDir = $Folder + '\WantedDocs\'
Get-ChildItem $Folder -Recurse -Include *.* |
select Directory, FullName, Name |
Export-Csv -Delimiter ',' -NoTypeInformation $OutputFile
$a = Import-Csv $OutputFile
$values = $a.Name.Split("_")
$a | Add-Member 'CliCode' -NotePropertyValue $values[3]
$a | Add-Member 'CopyDir' -NotePropertyValue $CopyDir
$a | Select Directory, FullName, Name, CliCode, CopyDir |
Export-Csv -Delimiter ',' -NoTypeInformation $SplitFile
Извините, если моя терминология неверна, но сейчас я пытаюсь создать пакетный файл, полный xcopy
команд, используя значения элементов из свойств.
xcopy 'C:\Test\OriginalDocs\A\file1_A_A_12345678.txt' 'C:\Test\WantedDocs\*' /Y
Когда вы используете Import-Csv
и назначаете его переменной, эта переменная содержит различные свойства, причем каждое свойство содержит массив значений, взятых из каждой строки в файле CSV.
В моем примере переменная $a
имеет свойства, называемые «Каталог», «Полное имя» и «Имя», заголовки трех столбцов в моем файле CSV.
Если мой файл CSV содержит следующие строки:
"Directory","FullName","Name" "C:\Test\OriginalDocs\A","C:\Test\OriginalDocs\A\file1_A_A_12345678.txt","file1_A_A_12345678.txt" "C:\Test\OriginalDocs\B","C:\Test\OriginalDocs\B\file2_B_B_43534554.txt","file1_B_B_43534554.txt"
Свойство Directory будет представлять собой массив из двух элементов: «C:\Test\OriginalDocs\A» и «C:\Test\OriginalDocs\B\».
Свойство FullName будет представлять собой массив из двух элементов: «C:\Test\OriginalDocs\A\file1_A_A_12345678.txt» и «C:\Test\OriginalDocs\B\file2_B_B_43534554.txt».
Свойство Name будет массивом из двух элементов: «file1_A_A_12345678.txt» и «file2_B_B_43534554.txt».
Я хочу знать, как я могу выбрать все [0] элементы в массиве для каждого свойства и построить команду xcopy
например если я сделаю это:
$xc1 = "xcopy '"
$xc2 = $a.FullName
$xc3 = "' '"
$xc4 = $a.CopyDir
$xc5 = $a.CliCode
$xc6 = "\*' /Y"
$xcopy = $xc1 + $xc2 + $xc3 + $xc4 + $xc5+ $xc6
Результирующая переменная $xcopy
содержит все значения массива
например для приведенного выше примера переменная xcopy
заканчивается значением:
xcopy 'C:\Test\OriginalDocs\A\file1_A_A_12345678.txt C:\Test\OriginalDocs\B\file2_B_B_43534554.txt' 'C:\Test\OriginalDocs\WantedDocs\ C:\Test\OriginalDocs\WantedDocs\12345678 43534554\*' /Y
Чего я хочу добиться, так это эффективно сделать это со значениями массива [0] из каждого выбранного свойства:
$xc1 = "xcopy '"
$xc2 = $a.FullName[0]
$xc3 = "' '"
$xc4 = $a.CopyDir[0]
$xc5 = $a.CliCode[0]
$xc6 = "\*' /Y"
$xcopy = $xc1 + $xc2 + $xc3 + $xc4 + $xc5+ $xc6
Запишите переменную $xcopy
в текстовый файл (я полагаю, используя Add-Content
)
Затем сделайте то же самое со значениями массива [1]:
$xc1 = "xcopy '"
$xc2 = $a.FullName[1]
$xc3 = "' '"
$xc4 = $a.CopyDir[1]
$xc5 = $a.CliCode[1]
$xc6 = "\*' /Y"
$xcopy = $xc1 + $xc2 + $xc3 + $xc4 + $xc5+ $xc6
И так далее, пока не будут обработаны все элементы массивов.
Таким образом, создание текстового/пакетного файла со строкой для каждого элемента в массивах, то есть всех [0], всех [1] и т. д.
Используя мой пример выше, я бы получил текстовый файл, как показано ниже.
xcopy 'C:\Test\OriginalDocs\A\file1_A_A_12345678.txt' 'C:\Test\OriginalDocs\WantedDocs\12345678\*' /Y
xcopy 'C:\Test\OriginalDocs\B\file2_B_B_43534554.txt' 'C:\Test\OriginalDocs\WantedDocs\43534554\*' /Y
Я искал foreach
и ForEach-Object
, но пока не нашел ничего подходящего для моих нужд. Может, это нельзя сделать?
-NoteProperty
иValue
. 2) ПРОВЕРЯЙТЕ, ПРОВЕРЯЙТЕ, ДВОЙНО ПРОВЕРЯЙТЕ любой пользовательский ввод, прежде чем использовать его. 3) используйте командлетJoin-Path
при объединении имен папок и файлов вместо жесткого кодирования обратной косой черты. Тогда... зачем использоватьXCOPY
вместо того, чтобы просто перебрать все строки в CSV, создать путь для этого конкретного файла и выполнить для негоCopy-Item
? - person Theo   schedule 04.01.2019Invoke-Expression
. Но я бы предпочел использовать чистое решение powershell безxcopy
. - person T-Me   schedule 04.01.2019Test-Path
иNew-Item
. - person Theo   schedule 04.01.2019