使用PowerShell脚本创建文件夹,然后从csv

时间:2018-10-05 03:22:46

标签: arrays powershell csv foreach directory

我想创建一个PowerShell脚本,该脚本可以导入带有两个标头(FileName和FileCreationTime)的CSV文件(details.csv)。理想情况下,脚本将在脚本保存的当前位置查找details.csv。

它将在脚本的当前位置创建与FileName同名的文件夹,然后更改该文件夹的创建日期以匹配FileCreationTime。

我的CSV示例块[在Excel的A和B列中制成,然后另存为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) 
    }

我当前的错误消息:

  

获取项:找不到路径'K:\ Users \ eschlitz \ Thesis \ Alpha',因为它不存在。

我不在乎是否为新文件夹编辑了创建时间的hh:mm:ss部分,但是如果我可以将它们全部标准化为12:00:00 AM,那将是一个好处。

~~~~~~~~~~~~~~~~~~~~~~~问题重复编辑~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~ 建议的修改,以显示我的问题与PowerShell: Change the timestamp (Date created) of a folder or file

有何不同

我能找到的所有与此相关的东西都只是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 :(得分:0)

如果您在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应该能够消化该日期,而不考虑系统的语言环境。