我正在尝试编写PowerShell脚本来执行以下操作。
使用它" current_name_datetime.csv"重命名源(FTP文件夹)目录中的文件。根据源文件" Source_list.csv"这个文件有目录" source,destination"我想要查看这个脚本。
根据Source_list.csv中的目的地将新重命名的文件复制到备份目录,此文件包含目录" source,destination"我想要查看这个脚本。
将新重命名的文件移动到最终目标目录,该目录不在我当前的脚本中。
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".
我在错误中看到它正在尝试复制目录而不是每个目录中的单个文件,并使用原始文件夹名称创建新文件夹并重命名文件夹并附加日期/时间戳。
答案 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课程,它们是开始时的优秀资源。