Я в основном пытаюсь создать подпрограмму, которая читает каталог с именованной папкой, создает файл 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
имеет свойства с именами "Directory", "FullName" и "Name", заголовки 3 столбцов в моем 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 будет представлять собой массив из 2 элементов: "C: \ Test \ OriginalDocs \ A" и "C: \ Test \ OriginalDocs \ B \"
Свойство FullName будет представлять собой массив из 2 элементов: «C: \ Test \ OriginalDocs \ A \ file1_A_A_12345678.txt» и «C: \ Test \ OriginalDocs \ B \ file2_B_B_43534554.txt»
Свойство Name будет представлять собой массив из 2 элементов: «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
, но до сих пор я не нашел ничего подходящего для моих нужд.Может быть, это невозможно сделать?