1

我有一个文件被删除的文件夹,我希望从该文件夹中提取文件并根据部分文件名移动到一个新文件夹。如果新文件夹丢失,则创建它。

我试图将以下内容放在一起,但是它会引发有关已存在路径的错误并且不会移动文件。

除了文件的最后 16 个字符之外,文件名可以是任何没有模式的东西,我将删除这些并使用剩余的作为文件夹名称。我对脚本真的很陌生,所以如果我犯了一个愚蠢的错误,我们将不胜感激。

编辑 我玩过不同的操作顺序,在新项目命令中添加了“-Force”,尝试使用“Else”而不是“If (!(”。我现在正处于它自豪地显示新目录的位置然后停止。我可以将移动项部分添加到每个循环的新部分,以便在创建和测试目录后对其进行处理吗?如果是这样,你如何安排 {} 部分?

编辑 2 我终于让它工作了,更新了下面的脚本,movie-item 命令在文件名中遇到特殊字符时出现问题,在我的情况下是方括号。-literalpath 开关为我解决了这个问题。谢谢各位的意见。

更新脚本 3.0

#Set source folder
$source = "D:\test\source\"
#Set destination folder (up one level of true destination)
$dest = "D:\test\dest\"
#Define filter Arguments
$filter = "*.txt"
<#
$sourcefile - finds all files that match the filter in the source folder
$trimpath - leaves $file as is, but gets just the file name.
$string - gets file name from $trimpath and converts to a string
$trimmedstring - Takes string from $trimfile and removes the last 16 char off the end of the string
Test for path, if it exists then move on, If not then create directory
Move file to new destination
#>
pushd $source
$sourcefile = Get-ChildItem $source -Filter $filter
foreach ($file in $sourcefile){
$trimpath = $file | split-path -leaf
$string = $trimpath.Substring(0)
$trimmedstring = $string.Substring(0,$string.Length-16)
If(!(Test-Path -path "$dest\$trimmedstring")){New-Item "$dest\$trimmedstring" -Type directory -Force}        
move-Item -literalpath "$file" "$dest\$trimmedstring"
}
4

2 回答 2

0

您可能需要调整正在使用的路径,但以下应该可以工作。

 $sourcefiles = ((Get-ChildItem $source -Filter $filter).BaseName).TrimEnd(16)
 foreach ($file in $sourcefiles)
 {
     if(!(Test-Path "$dest\$file")){
         New-item -ItemType directory -path "$dest\$file"
     }
    Move-Item "$source\$file" "$dest\file"
 }
于 2015-11-06T13:46:26.200 回答
0

我终于让它工作了,更新了下面的脚本,movie-item 命令在遇到文件名中的特殊字符时出现问题,在我的情况下是方括号。-literalpath 开关为我解决了这个问题。谢谢各位的意见。

#Set source folder
$source = "D:\test\source\"
#Set destination folder (up one level of true destination)
$dest = "D:\test\dest\"
#Define filter Arguments
$filter = "*.txt"
<#
$sourcefile - finds all files that match the filter in the source folder
$trimpath - leaves $file as is, but gets just the file name.
$string - gets file name from $trimpath and converts to a string
$trimmedstring - Takes string from $trimfile and removes the last 16 char off the end of the string
Test for path, if it exists then move on, If not then create directory
Move file to new destination
#>
pushd $source
$sourcefile = Get-ChildItem $source -Filter $filter
foreach ($file in $sourcefile){
$trimpath = $file | split-path -leaf
$string = $trimpath.Substring(0)
$trimmedstring = $string.Substring(0,$string.Length-16)
If(!(Test-Path -path "$dest\$trimmedstring")){New-Item "$dest\$trimmedstring" -Type directory -Force}        
move-Item -literalpath "$file" "$dest\$trimmedstring"
}
于 2015-11-15T06:20:15.640 回答