Сценарий PowerShell для создания папок, а затем изменить дату создания из CSV - PullRequest
0 голосов
/ 05 октября 2018

Я хотел бы создать сценарий PowerShell, который может импортировать файл CSV (details.csv) с двумя заголовками (FileName и FileCreationTime).В идеале сценарий должен искать файл details.csv в текущем местоположении, в котором он сохранен.

Он создает папки в текущем местоположении сценария с тем же именем, что и FileName, и тогда дата создания указанной папкибыть изменены, чтобы соответствовать FileCreationTime.

Пример куска моего CSV [сделанного в столбцах A & B Excel, затем сохраненного как CSV (с разделителями-запятыми) (*. Csv)]:

FileName    FileCreationTime
Alpha       5/17/2017
Bravo       12/23/2013
Charlie     11/8/2015

Я искалрешение, но ничего, что я делаю, кажется не совсем правильным.В настоящее время у меня есть это:

Import-Csv -Path 'K:\Users\eschlitz\Thesis\details.csv' -Delimiter "," |
    ForEach-Object { 
        $path = 'K:\Users\eschlitz\Thesis'
        # Again, didn't want a definite path here, but I was trying different
        # tweaks to see if I could get at least one instance to work correctly.
        New-Item -Path $path -Name $$_.Filename -Type Directory
        (Get-Item $_.Filename).CreationTime = (Get-Date $_.FileCreationTime) 
    }

Мое текущее сообщение об ошибке:

Get-Item: Не удается найти путь 'K: \ Users \ eschlitz \ Thesis \ Alpha', потому что это делаетне существует.

Меня не волнует, редактируется ли часть времени создания чч: мм: сс для новых папок, но было бы неплохо, если бы я мог стандартизировать их вседо 12:00:00

~~~~~~~~~~~~~~~~~~~~~~~ Редактирование вопроса Редактировать ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Рекомендуется изменить, чтобы показать, чем мой вопрос отличается от PowerShell: изменить метку времени (дата создания) папки или файла

Все, что я смог найти, относилось к этому, либо только A) создавал папки из CSV, либо был B) скрипт для редактирования даты создания одной папки / или пакетное редактирование даты создания нескольких папок, но только сединое новое время создания.Я надеялся, что сценарий потерпит неудачу, если он не сможет правильно найти новое время создания, уникальное для каждой новой папки, что избавит меня от необходимости вручную удалять неправильные папки или редактировать время создания вручную.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Редактировать ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Просто хотел опубликовать готовые рабочие версии на тот случай, если они понадобятся кому-нибудь в будущем.

#Adds folders to specified directory and modifies their creation date
Import-Csv -Path 'K:\Users\eschlitz\Thesis\details.csv' -Delimiter "," |
    ForEach-Object {
        $path = ' K:\Users\eschlitz\Thesis'
        $dir = New-Item -Path $path -Name $_.Filename -Type Directory
        $dir.CreationTime = [DateTime]::ParseExact($_.FileCreationTime, 
        'M\/d\/yyyy', [Globalization.CultureInfo]::InvariantCulture)
} 

Инемного другая версия в зависимости от потребностей:

#Adds folders and then modifies their creation date where script+csv 
#currently are 
Set-Location -Path "$PSScriptRoot"
Import-Csv -Path ".\details.csv" -Delimiter ',' |
    ForEach-Object {
        New-Item -Path "$PSScriptRoot" -Name $_.FileName -Type Directory
        (Get-Item $_.Filename).CreationTime = 
        ([DateTime]::ParseExact($_.FileCreationTime, 'M\/d\/yyyy', 
        [Globalization.CultureInfo]::InvariantCulture))
} 

1 Ответ

0 голосов
/ 05 октября 2018

Папка не создана, т.к. у вас есть опечатка в операторе New-Item ($$_.Filename$_.Filename), и даже если она будет создана Get-Item, скорее всего, ее не удастся найти.потому что он смотрит в текущем рабочем каталоге, а вы создаете папку в $path.Вы можете избежать последней проблемы, захватив объект DirectoryInfo, который New-Item возвращает в переменную:

$dir = New-Item -Path $path -Name $_.Filename -Type Directory
$dir.CreationTime = (Get-Date $_.FileCreationTime)

Вам также может понадобиться фактически проанализировать строку даты в значение DateTime (в зависимости отВаш языковой стандарт):

[DateTime]::ParseExact($_.FileCreationTime, 'M\/d\/yyyy', [Globalization.CultureInfo]::InvariantCulture)

Если вы определили дату в формате ISO (yyyy-MM-dd), Get-Date сможет ее переварить независимо от языкового стандарта системы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...