我有一个脚本,我试图通过一个目录排序并打开所有的zip文件并将文本文件存储到一个目录。这是代码:
#Script to open zip files in tree
New-Item E:\Files -type directory
Get-ChildItem -Path E:\SNL_Insurance\* -Recurse -Exclude "*.md5"|
ForEach-Object {
$file = $_
write-host $file;
$destination = "E:\Files"
$shell = New-Object -com shell.application
$zip = $shell.NameSpace($file) |
foreach($item in $_.items()){
$shell.Namespace($destination).copyhere($item)
}
}
我想我几乎拥有它,但不断得到这个错误(任何关于管道的详细说明都会有所帮助):
Unexpected token 'in' in expression or statement.
At E:\Expand-ZIPFile.ps1:14 char:19
+ foreach($item in <<<< $_.items()){
+ CategoryInfo : ParserError: (in:String) [], ParseException
+ FullyQualifiedErrorId : UnexpectedToken
编辑: 啊......谢谢你的区别。我进行了编辑,但在每次“写主机”检查后看到文件名后,我收到以下错误: `你不能在空值表达式上调用方法。在E:\ Expand-ZIPFile.ps1:14 char:30 + foreach($ item in $ zip.items&lt;&lt;&lt;&lt;()){+ CategoryInfo:InvalidOperation :( items:String)[],RuntimeException + FullyQualifiedErrorId:InvokeMethodOnNull
EDIT2:所以原始代码会将文件复制到新目录,但也会复制整个zip文件。我试图添加一个if语句只复制.txt文件,但代码只是逐步遍历每个目录而不复制任何东西。如果你有任何想法,我会用尽所有的想法,这将是值得赞赏的。这是代码:
new-Item E:\Files -type directory
Get-Childitem -path E:\SNL_Insurance\* -recurse -exclude "*.md5" |
Foreach-object {
$file = $_
write-host $file;
$destination = "E:\Files"
$shell = new-object -com shell.application
$zip = $shell.NameSpace($file.Fullname)
foreach($item in $zip.items()){
if ($item.Extension -eq ".txt") {
$shell.Namespace($destination).copyhere($item)
}
}
}
答案 0 :(得分:0)
你让foreach
with ForEach-Object
loops感到困惑。前者既不读也不写管道。此外,$file
是FileInfo
对象,而不是路径。 NameSpace
方法需要路径字符串,因此您需要使用$file.FullName
。
替换
$zip = $shell.NameSpace($file) |
foreach($item in $_.items()){
$shell.Namespace($destination).copyhere($item)
}
与
$zip = $shell.NameSpace($file.FullName)
foreach($item in $zip.items()){
$shell.Namespace($destination).copyhere($item)
}