【发布时间】:2020-01-27 11:58:12
【问题描述】:
我目前的 PS 脚本是:
$loc = "C:\Users\USER\Desktop\New folder1"
$files = Get-ChildItem -Path $loc
for ($i=0; $i -lt $files.Count; $i++)
{
$outfile = $files[$i].FullName
$filename = Split-Path -Path $outfile -Leaf -Resolve
$Year = $filename -replace "Status_\d{0}(\d{4})[\d_]*.txt",'$1'
$Month = $filename -replace "Status_\d{4}(\d{2})[\d_]*.txt",'$1'
$folderYYYY = Join-Path -Path $loc -ChildPath $Year
$folderMM = Join-Path -Path $folderYYYY -ChildPath $Month
$ExistsYYYY = Test-Path $folderYYYY
$ExistsMM = Test-Path $folderMM
If (!$ExistsYYYY)
{
New-Item -Type directory -Path $folderYYYY
}
If (!$ExistsMM)
{
New-Item -Type directory -Path $folderMM
}
Move-Item $outfile $folderMM
}
该脚本应该将当前位于 $loc 目录中的文件移动到 YYYY-MM 子文件夹中。如果 YYYY 或 MM 子文件夹不存在,则会创建它。如果子文件夹路径已经存在,则将文件移动到该子文件夹中。
文件名始终采用以下格式:
Status_20180215_074559.txt
所以对于上面的文件,YYYY 会映射到 2018,MM 会映射到 02
通过测试脚本 - 如果 YYYY 子文件夹不存在,则脚本运行良好。 如果 YYYY 子文件夹已经存在,那么我最终会得到脚本创建的以下路径:
C:\Users\USER\Desktop\New folder1\2018
C:\Users\USER\Desktop\New folder1\2018\02
C:\Users\USER\Desktop\New folder1\2018\2018
文件被上面的脚本移动到下面的路径中:
C:\Users\USER\Desktop\New folder1\2018\02
我也收到以下错误:
Move-Item : Access to the path 'C:\Users\USER\Desktop\New folder1\2018' is denied.
At line:14 char:10
+ Move-Item <<<< $outfile $folder
+ CategoryInfo : WriteError: (C:\Users\USER...ew folder1\2018:DirectoryInfo) [Move-Item], IOException
+ FullyQualifiedErrorId : MoveDirectoryItemIOError,Microsoft.PowerShell.Commands.MoveItemCommand
任何停止创建以下路径的方法:
C:\Users\USER\Desktop\New folder1\2018\2018
另外,如何解决抛出的错误?
非常感谢
编辑:尝试了@Theo 脚本,但出现以下问题:
然后我删除了所有的 cmets 和空行,认为这可能会在某处引起一些问题,但随后出现以下错误:
所以,在其他人的帮助下,我的脚本的问题是 $files 行 - 它应该只查找文件:
$files = Get-ChildItem -Path "$loc\*.txt"
另外,@Theo 提供的修改后的 PS 脚本非常有用,因为我有 PS 版本 2
【问题讨论】:
-
你的正则表达式似乎到处都是。例如,您将
.与.匹配,而它应该是\.以匹配文字点,并且当它应该是CSV 时检查txt。您可能只是在运行不同的脚本,因此很难提供帮助。 -
嗨@Seth这是我的确切脚本,唯一的区别是位置参数有我的实际用户名,而不是用户。才发现,这个文件其实是个txt文件,我错误地把它标记为.csv
-
你指的是@Theo提供的脚本吗?如果是这样,我删除了所有的 cmets 和空行,但它仍然没有工作
标签: powershell