如何解决用于删除 S3 存储桶中文件的本机 PowerShell ForEach 循环
我正在尝试编写一个简单的 PowerShell 脚本来从 AWS S3 存储桶中删除文件。我无法从循环中的项目中正确拆分文件名。
如何正确选择文件名?
示例记录名称:
2021-06-07 16:08:15 1876349 20210502210533.csv
2021-06-07 16:44:53 1858461 210502210533.csv
2021-06-07 16:18:39 276597534 20210424203918.csv
示例脚本:
$all_files=aws s3 ls s3://bucket.host.com/folder1/folder2/folder3/folder4/ --profile dev
foreach($file in $all_files)
{
aws s3 rm s3://bucket.host.com/folder1/folder2/folder3/folder4/$file.Split(' ')[6] --profile dev
}
结果:
delete: s3 ls s3://bucket.host.com/folder1/folder2/folder3/folder4/2021-06-07 16:44:53 1858461 20210502210533.csv.Split
delete: s3 ls s3://bucket.host.com/folder1/folder2/folder3/folder4/2021-06-07 16:18:39 276597534 20210424203918.csv.Split
delete: s3 ls s3://bucket.host.com/folder1/folder2/folder3/folder4/2021-06-07 15:50:41 276597534 20210424204122.csv.Split
注意整个记录是如何存在的(没有发生分裂)。我如何可靠地拆分它?
编辑 1:
$all_files=aws s3 ls s3://bucket.host.com/folder1/folder2/folder3/folder4/ --profile dev
PS C:\Users\me> $all_files
2021-06-08 02:50:37 4637885036 20210425202931.csv
2021-06-08 02:53:23 4753217891 20210426204043P.csv
2021-06-08 02:59:10 4838159267 20210426204346.csv
2021-06-08 02:58:07 4871146830 20210426204407.csv
2021-06-08 03:00:24 4641073848 20210427203146.csv
2021-06-08 02:52:29 4633473584 20210427203836.csv
2021-06-08 02:57:55 4633473584 20210427204657.csv
2021-06-08 02:56:25 4633473584 20210428203618.csv
2021-06-08 02:53:30 4633473584 20210429204253.csv
PS C:\Users\me> ForEach($file in $all_files){$command = 'aws s3 rm s3://bucket.host.com/folder1/folder2/folder3/folder4/' + $file.Split(' ')[-1] + ' --profile dev' & $command}
At line:1 char:177
+ ... folder3/folder4/' + $file.Split(' ')[-1] + ' --profile vis_dev' & $comman ...
+ ~
Unexpected token '&' in expression or statement.
+ CategoryInfo : ParserError: (:) [],ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnexpectedToken
如果我将 & $command
放在最后,然后运行 Invoke-Expression $command
作为第二个表达式,最后一个文件将被删除。
& $command
如何作为循环的一部分运行?
解决方法
试试这个:
AType
如果您只是使用普通字符串连接,这应该会输出您要查找的内容。
如果您打算使用字符串 BType
方法进行拆分,那么您对索引 type AType = {
A1Prop: string
A2Prop: string
SharedProp: string
}
type BType = {
B1Prop: string
B2Prop: string
SharedProp: string
}
type ABType = AType & BType
const someObject: ABType = {
A1Prop: 'string',A2Prop: 'string',B1Prop: 'string',B2Prop: 'string',SharedProp: 'string'
}
const AllPropsOfA : AType = someObject // ok
const AllPropsOfB : BType = someObject // ok
的依赖是有问题的。 const ATypeProps = ['A1Prop','A2Prop','SharedProp'] as const
const BTypeProps = ['B1Prop','B2Prop','SharedProp'] as const
type ATypeKeys = typeof ATypeProps[number]
type BTypeKeys = typeof BTypeProps[number]
type AType = { [K in ATypeKeys]: string }
type BType = { [K in BTypeKeys]: string }
const someObject = {
A1Prop: 'string',SharedProp: 'string'
}
const pick = <T,K extends keyof T>(obj: T,keys: readonly K[]): Pick<T,K> => {
const result = {} as Pick<T,K>
keys.forEach((key) => result[key] = obj[key])
return result
}
const AllPropsOfA: AType = pick(someObject,ATypeProps)
/* {
"A1Prop": "string","A2Prop": "string","SharedProp": "string"
} */
const AllPropsOfB: BType = pick(someObject,BTypeProps)
/* {
"B1Prop": "string","B2Prop": "string","SharedProp": "string"
} */
只会为您提供结果数组中的最后一个元素。
如果您希望将结果字符串作为命令执行,我会将其分配给一个变量并包含其他必需的参数,然后使用调用运算符 ($All_Files = @(
'2021-06-07 16:08:15 1876349 20210502210533.csv'
'2021-06-07 16:44:53 1858461 210502210533.csv'
'2021-06-07 16:18:39 276597534 20210424203918.csv'
)
ForEach($File in $All_Files)
{
'aws s3 rm s3://bucket.host.com/folder1/folder2/folder3/folder4/' + $file.Split(' ')[-1]
}
) 来执行它。
.Split()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。