【发布时间】:2015-02-18 14:31:48
【问题描述】:
前段时间,@Magoo 很好地帮助我制定了 FOR /F 命令将文件归档到 7-zip:
Using FOR or FORFILES batch command to individually archive specific files
从那以后,我对它进行了一些扩展,并希望用它做更精细的事情。但是,为了让这个问题保持简单,我已经包含了一些基础知识来尝试使其正常工作,但我并没有取得太大的成功。
我对 PowerShell 比较陌生,我有一些特定的理由使用它而不是批处理文件,继续前进。 我了解一些更有经验的用户可能会注意到在 PowerShell 中使用此类语句会降低性能,但这对我来说不是一个重要问题。
$env:Path += ";C:\Program Files\7-Zip"
$sourcedir = read-host "Enter the directory to archive: "
foreach ($aname in {
'cmd /c dir /s/b /a-d "$sourcedir\*.iso" '
'cmd /c dir /s/b /a-d "$sourcedir\*.daa" '
'cmd /c dir /s/b /a-d "$sourcedir\*.nrg" '
'cmd /c dir /s/b /a-d "$sourcedir\*.flp" '}
) {
IF NOT EXIST $aname.7z (
echo 7z a -t7z "$aname.7z" "$aname" -mx9 -mmt >> Z:\test\7z-log.txt
ECHO "$aname" archived.
) ELSE (
ECHO "$aname" archive file already exists.
)
}
我在使用 IF EXIST 语句时遇到了一些问题,即使我删除了 IF 并有一个单行 ECHO 只是为了进一步简化它,但我无法让它输出我想要的内容。
所以,我尝试了另一种方法:
$env:Path += ";C:\Program Files\7-Zip"
$sourcedir = read-host "Enter the directory to archive: "
$dir_iso = ForEach-Object { cmd /c dir /s/b /a-d "$sourcedir\*.iso" }
$dir_daa = ForEach-Object { cmd /c dir /s/b /a-d "$sourcedir\*.daa" }
$dir_nrg = ForEach-Object { cmd /c dir /s/b /a-d "$sourcedir\*.nrg" }
$dir_flp = ForEach-Object { cmd /c dir /s/b /a-d "$sourcedir\*.flp" }
foreach ($aname in $dir_iso,$dir_daa,$dir_nrg,$dir_flp) {
ECHO "$aname" archived.
}
但这所做的是将每种类型的每个项目聚集在一起,然后将“归档”附加到该集合中。比如:
C:\folder1\iso1.iso C:\folder1\iso2.iso C:\folder1\iso3.iso archived.
C:\folder2\image.nrg archived.
C:\folder3\app1.flp C:\folder3\app2.flp archived.
代替:
C:\folder1\iso1.iso archived.
C:\folder1\iso2.iso archived.
C:\folder1\iso3.iso archived.
C:\folder2\image.nrg archived.
C:\folder3\app1.flp archived.
C:\folder3\app2.flp archived.
我很难让它发挥作用。有人可以帮忙吗?
谢谢。
【问题讨论】:
标签: windows powershell batch-file for-loop foreach