powershell - 每个文件压缩文件,同名
问题描述
我希望你们在 COVID-19 的这段时间都安全。
我正在尝试生成一个脚本,该脚本进入目录并将每个文件压缩为与文件同名的 .zip,例如:
sample.txt -> sample.zip
sample2.txt -> sample2.zip
但是我遇到了困难,我不习惯powershell,我正在学习和改进这个脚本。最后,它将是一个脚本,删除早于 X 天的文件,压缩文件并使它们在 ftp 中上传.. 排除超过 X 的部分我已经管理了几天,现在我抓住了一点这个。
此刻最后一次尝试。
param
(
#Future accept input
[string] $InputFolder,
[string] $OutputFolder
)
#test folder
$InputFolder= "C:\Temp\teste"
$OutputFolder="C:\Temp\teste"
$Name2 = Get-ChildItem $InputFolder -Filter '*.csv'| select Name
Set-Variable SET_SIZE -option Constant -value 1
$i = 0
$zipSet = 0
Get-ChildItem $InputFolder | ForEach-Object {
$zipSetName = ($Name2[1]) + ".zip "
Compress-Archive -Path $_.FullName -DestinationPath "$OutputFolder\$zipSetName"
$i++;
$Name2++
if ($i -eq $SET_SIZE) {
$i = 0;
$zipSet++;
}
}
解决方案
您可以稍微简化一下,看起来大多数问题是因为在您的脚本示例$Name2
中将包含一组Get-ChildItem $InputFolder
与循环中返回的项目不同的项目(即可能有文件以外的其他对象.csv
)。
处理事情的最好方法是将变量与完整的文件对象一起使用(即您不需要使用|select name
)。因此,我立即获取所有 CSV 文件对象并将其存储在变量$CsvFiles
.
我们还可以$_
在ForEach-Object
其中使用特殊变量来表示当前对象。我们也可以使用$_.BaseName
不带扩展名的名称给我们(假设这是您想要的,否则用于$_Name
获取名称为 的 zip xyz.csv
)。
所以代码的简化版本可以是:
$InputFolder= "C:\Temp\teste"
$OutputFolder="C:\Temp\teste"
#Get files to process
$CsvFiles = Get-ChildItem $InputFolder -Filter '*.csv'
#loop through all files to zip
$CsvFiles | ForEach-Object {
$zipSetName = $_.BaseName + ".zip"
Compress-Archive -Path $_.FullName -DestinationPath "$OutputFolder\$zipSetName"
}
推荐阅读
- oracle - odac 安装执行先决条件检查不起作用
- laravel - 拉出特定路线的视图名称 - Laravel
- ios - 具有不同类型 JSON 数据的通用 UITableViewCell
- laravel - 自动依赖注入处理异常 laravel
- azure-functions - 有没有办法在 Azure Functions 中使用 PowerShell 将结果导出到 SQL Server?
- android - 选项卡图标未填充全宽
- jquery - 在 web2py 用户注册页面上实现 jquery 多选
- javascript - 显示和隐藏多个动态 html 弹出框的问题
- sql - 在 oracle sql 中计算一天的不同值
- amazon-web-services - 使用 Route 53 和 ACM 部署 AWS S3 CloudFront 中的鸡和蛋