【问题标题】:Powershell unzip file with .zip extension and move it to another folderPowershell 解压缩扩展名为 .zip 的文件并将其移动到另一个文件夹
【发布时间】:2020-05-02 11:58:01
【问题描述】:

我希望你们中的一些人可以帮助我。我在修改 powershell 脚本时遇到了困难。

脚本检查特定文件夹(源)中的 zip 文件(文件名是固定值)并将其移动到另一个文件夹(目标),但是我需要一个检查 .zip 扩展名的脚本,而不是修复值并将其也移动到另一个文件夹。我现在正在使用这个脚本:

powershell.exe -nologo -noprofile -command "& { $shell = New-Object -COM Shell.Application; $target = $shell.NameSpace('D:\Anlagen'); $zip = $shell.NameSpace('C:\Temp\Rechnungen\Outlook'); $target.CopyHere($zip.Items(), 16); }"

如您所见,我需要将此脚本作为批处理文件。

【问题讨论】:

  • 您确定“脚本会检查特定文件夹(源)中的 zip 文件(文件名是固定值)并将其移动到另一个文件夹(目标)”吗?对我来说,代码似乎不会将 zip 文件从源移动到目标!您是否尝试过在 powershell 控制台或 ISE 中运行这四行代码,$shell = New-Object -COM Shell.Application$target = $shell.NameSpace('D:\Anlagen')$zip = $shell.NameSpace('C:\Temp\Rechnungen\Outlook')$target.CopyHere($zip.Items(), 16)?如果是这样,会发生什么?它与您的描述相符吗?如果没有,为什么不呢?
  • 为什么不直接将存档解压缩到目标目录?解压缩然后移动似乎很浪费。
  • 对不起,如果我描述我的问题令人困惑。该脚本需要执行以下操作:该脚本检测一个或多个 zip 文件并将内容直接解压缩到目标文件夹。必须删除 zip 文件(在解压缩 obv 之后),因为之后将不会使用它们。

标签: powershell batch-file unzip


【解决方案1】:

使用Expand-Archive 将文件解压缩到一个目录,然后从您的批处理脚本中将文件复制到其他位置。如果您需要从批处理脚本执行此操作:

powershell.exe -c "Expand-Archive -Path 'C:\path\to\archive.zip' -DestinationPath 'C:\unzip\directory'"
xcopy /s /e /t "C:\unzip\directory" "C:\final\destination\directory"

请注意,UNC 路径也应该适用于任一命令,而不仅仅是本地路径。

【讨论】:

  • “但您需要先将驱动器安装到具有 net use 的 UNC 路径,然后才能使用 xcopy 与网络位置交互”。我不相信这是真的。
  • 我已经有一段时间没有使用xcopy了,并且盲目地相信了一位告诉我的同事。我将删除它,因为我找不到任何证实该声明的信息。
  • 你可以使用robocopy,它肯定支持UNC路径...
  • 是的,xcopy 和 robocopy 建立在相同的底层代码库上。它们之间唯一真正的区别是支持的命令行选项。然而,Robocopy 是一个更有用的工具。我要补充一点,在这种情况下,两者都不是必需的。大多数解压缩工具都允许您指定输出路径。为什么要解压然后复制呢?
  • OP 可能需要存档中文件的两个副本。也许他们会回答主要问题。
【解决方案2】:

如果您有 7-Zip:

set 7zip="C:\Program Files\7-Zip\7z.exe"

IF EXIST "path\to\file.zip" (

    %7zip% x -o"path\to\new\folder" "path\to\file.zip"
)

以下行将在子文件夹中递归搜索任何 zip 文件。在下面的示例中,脚本将在 C: 的根目录处开始递归搜索。文件的路径将保存为变量,以便稍后调用。

for /f "tokens=*" %%x in ('forfiles /p C:\ /m *.zip /s /c "cmd /c echo @path"') do if exist %%x (

    %7zip% x -o"path\to\new\folder" %%x
)

另一种递归搜索多个驱动器号的方法是将驱动器号设置为 FOR 循环中的变量。以下示例将检查驱动器号是否存在,然后在整个目录中搜索 zip 文件。示例:

for %%i in (c:\, d:\, e:\, f:\, <enter as many as needed>) do if exist %%i (

    for /f "tokens=*" %%x in ('forfiles /p %%i /m *.zip /s /c "cmd /c echo @path"') do if exist %%x (

        %7zip% x -o"path\to\new\folder" %%x
    )
)

【讨论】:

  • 7zip 不需要解决这个问题。所有 Windows 系统都安装了必要的组件。
  • 知道了。只是为了确保我理解,当您发布 7-Zip 解决方案时有必要,但当我发布 7-Zip 解决方案时没有必要? stackoverflow.com/a/53246000/10123413
  • 绝对。阅读您引用的那个线程的 OP。他们正在就已经使用 7z 的现有脚本寻求帮助。是的,我可以通过提出一种完全不同的方法来更加混淆问题,但没有必要。
猜你喜欢
  • 2021-12-07
  • 1970-01-01
  • 2021-04-29
  • 2021-05-16
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 2016-04-20
  • 1970-01-01
相关资源
最近更新 更多