脚本帮助重命名 - 复制 - 移动

时间:2015-10-01 18:11:48

标签: powershell

我正在尝试编写PowerShell脚本来执行以下操作。

  1. 使用它" current_name_datetime.csv"重命名源(FTP文件夹)目录中的文件。根据源文件" Source_list.csv"这个文件有目录" source,destination"我想要查看这个脚本。

  2. 根据Source_list.csv中的目的地将新重命名的文件复制到备份目录,此文件包含目录" source,destination"我想要查看这个脚本。

  3. 将新重命名的文件移动到最终目标目录,该目录不在我当前的脚本中。

  4. Source_list.csv内容

    cscenter,Costume_Supercenter

    fkimports,FKImports

    我的剧本:

    $sdfiles = Get-Content c:\!tony\Source_list.csv
    $sourceDir = "c:\test\"
    $destinationDir = "c:\testing\"
    
    Get-ChildItem $sourceDir -Recurse -Include $sdfiles "*.csv"|
    ForEach-Object{
           $newname= "{0}{1}_{2}.csv" -f $destinationDir, $_.BaseName,     [datetime]::Now.ToString('MM-dd-yyyy-hh-mm-ss')
        $_|Copy-Item -Include ,$sdfiles -Destination $newname -whatif }
    

    错误:

    What if: Performing operation "Copy Directory" on Target "Item: C:\test\cscenter Destination: C:\testing\cscenter_10-01-2015-12-22-24.csv".
    

    我在错误中看到它正在尝试复制目录而不是每个目录中的单个文件,并使用原始文件夹名称创建新文件夹并重命名文件夹并附加日期/时间戳。

1 个答案:

答案 0 :(得分:0)

混淆。 -Include参数应该只接受一个字符串数组,将"*.csv"抛到它的末尾将无法使用AFAIK。另外它将解释CSV的整行,即搜索文件“cscenter,Costume_Supercenter”,所以不应返回任何内容。至少这是我在计算机上复制时所看到的。

最后,您尝试过滤文件,将其传输到Copy-Item并尝试再次过滤?

我采取更直截了当的方法:

$sdfiles = Import-CSV c:\!tony\Source_list.csv -Header @("File", "Folder")

$sourcedir = "c:\test\"
$destinationdir = "c:\testing\"

$sdfiles | ForEach-Object {
    $path = $sourcedir + $_.File + ".csv"
    $folder = $destinationdir + $_.Folder + '\'
    if (!(Test-Path $folder)) { New-Item -Type Directory -Path $folder }
    if (Test-Path ($path))
    {
        $newname = "{0}{1}_{2}.csv" -f $folder, $_.File, (Get-Date).ToString('MM-dd-yyyy-hh-mm-ss')
        Copy-Item -Path $path -Destination $newname -whatif
    }
    else { Write-Error "File $($_.File) not found" }
}

它有点笨重,但更容易阅读和调整到你喜欢的。请注意,Import-CSV确实需要PowerShell v3。如果你有v2并且需要帮助调整它以获得二维数组,请告诉我。

我还建议在PowerShell上查看Microsoft的MVA课程,它们是开始时的优秀资源。