【发布时间】:2020-10-04 23:57:35
【问题描述】:
我所做的是使用 powershell ps1 文件和 Windows PowerShell ISE 将照片文件从 SD 卡复制到 HDD。 我从图像 exif 中获取拍摄日期并将其添加到目标路径。 问题是 robocopy 创建文件夹并添加了我不想拥有的奇怪前缀。 结果,我可以看到两个同名“2020”的子文件夹,一个是手动创建的,另一个是 robocopy 创建的。 仅当我使用 CMD 列出文件夹时才会看到此前缀。 在 output.log 和 powershell 中没有看到的前缀。
$copy_from = "G:\DCIM\100MSDCF\"
$copy_to = "C:\Photos\"
function GetDateTaken {
param (
[Parameter(ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
[Alias('FullName')]
[String]
$Path
)
begin {
$shell = New-Object -COMObject Shell.Application
}
process {
$returnvalue = 1 | Select-Object -Property Name, DateTaken, Folder
$returnvalue.Name = Split-Path $path -Leaf
$returnvalue.Folder = Split-Path $path
$shellfolder = $shell.Namespace($returnvalue.Folder)
$shellfile = $shellfolder.ParseName($returnvalue.Name)
$returnvalue.DateTaken = $shellfolder.GetDetailsOf($shellfile, 12)
$returnvalue.DateTaken
}
}
$file = Get-ChildItem -Path $copy_from -recurse -include ('*.jpg','*.arw')
$i = 0
$jpg = 0
$arw = 0
$logifile = 'output.log'
if ([System.IO.File]::Exists($logifile)) {
Clear-Content $logifile
Write-Host ("Logfile cleaned: $logifile")
} else {
try {
New-Item -Path . -Name $logifile | Out-Null
Write-Host ("New logfile created: $logifile")
}
catch {
"Failed to create $logifile"
}
}
foreach ($file in $file) {
if ($file.extension -eq '.JPG') { $jpg++ }
if ($file.extension -eq '.ARW') { $arw++ }
$i++
$datetaken = ($file.fullname | GetDateTaken).Split(' ')[0]
$datetaken_Day = $datetaken.Split('.')[0]
$datetaken_Month = $datetaken.Split('.')[1]
$datetaken_Year = $datetaken.Split('.')[2]
$TargetPath = "$copy_to$datetaken_Year\$datetaken_Month\$datetaken_Day\"
Write-Host ("$i. " + $file.Name + " `tDate taken: " + $datetaken)
robocopy $copy_from $TargetPath $file.Name /ts /fp /v /np /unilog+:$logifile | Out-Null
}
Write-Host ("`nTotal: " + $i + " files (" + $jpg + " JPG files, " + $arw + " ARW files)")
如果写$TargetPath = $copy_to + $datetaken_Year + "\" + $datetaken_Month + "\" + $datetaken_Day + "\"没有帮助。
如果我将 /fat 选项设置为 robocopy,则无济于事。
但是,例如,当我手动设置年份时,一切正常$datetaken_Year = 2020
为了创建正确的文件夹名称应该解决什么问题?
【问题讨论】:
-
您没有显示
$copy_to的填充方式。 -
添加了完整的脚本
-
这个
foreach ($file in $file) {不是它应该的样子。 [grin]$Collection和$CurrentItemotta 有不同的名称。 -
通过阅读您的代码,似乎不需要的字符可能来自数据源,而不是 robocopy。您是否尝试通过
Format-Hex发送该信息以查看实际情况? -
foreach 有效,这不是问题。以十六进制格式输出显示不需要的字符 C:\Photos\?2020\ 我不知道为什么或如何摆脱它。尝试添加.Trim(),没有帮助。
标签: windows powershell robocopy