3

Я нашел этот сценарий PowerShell в Интернете, и я хотел бы запустить его из пакетного файла. Может ли кто-нибудь дать мне правильный синтаксис для этого сценария. И, если это возможно, сделайте возможным ввод нескольких каталогов, скрипт будет zip.

########################################################
# out-zip.ps1
#
# Usage:
#    To zip up some files:
#       ls c:\source\*.txt | out-zip c:\target\archive.zip $_
#
#    To zip up a folder:
#       gi c:\source | out-zip c:\target\archive.zip $_
########################################################

$path = $args[0]
$files = $input

if (-not $path.EndsWith('.zip')) {$path += '.zip'} 

if (-not (test-path $path)) { 
  set-content $path ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18)) 
} 

$ZipFile = (new-object -com shell.application).NameSpace($path) 
$files | foreach {$zipfile.CopyHere($_.fullname)}

Так что мне действительно нужен cmd-файл, который говорит это (желательно с дополнительными папками)

gi c:\source | out-zip c:\target\archive.zip $_

Спасибо, Ким!

2 ответа2

2

У меня была такая же проблема только с созданным zip-файлом размером 1 КБ. Я обнаружил, что включил в команду параметр -noexit: powershell.exe -noexit -Command "gi c:\source | C:\users\Kim\Dpcuments\WindowsPowerShell\out-zip.ps1 c:\target\archive .zip»

Конечно, это может вызвать некоторые другие проблемы при попытке использовать это в командном файле, потому что он оставляет PowerShell открытым. Есть некоторые другие решения, которые я исследую, которые будут либо просто ждать заданное количество времени для завершения "zip", либо сравнивать исходные файлы с готовым zip файлом перед выходом.

1

Я очистил файл сценария PowerShell для вас:

<#
.SYNOPSIS
Zip up files and folders
.EXAMPLE
To zip up some files:
    ls c:\source\*.txt | out-zip.ps1 c:\target\archive.zip
.EXAMPLE
To zip up a folder:
    gi c:\source | out-zip c:\target\archive.zip
#>

param(
    [parameter(Mandatory=$TRUE,ValueFromPipeline=$TRUE)] $files,
    [parameter(Mandatory=$TRUE,position=0)] [string] $path
)

if (-not $path.EndsWith('.zip')) {$path += '.zip'} 

if (-not (test-path $path)) { 
  set-content $path ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18)) 
} 

$zipFile = (new-object -com shell.application).NameSpace([System.IO.Path]::GetFullPath($path)) 
$files | %{$zipfile.CopyHere($_.fullname)}

Предполагая, что out-zip.ps1 сохранен в C:\users\Kim\Dpcuments\WindowsPowerShell\out-zip.ps1 , ниже приведен пакетный файл, который вам нужен.

@echo off
powershell.exe -Command "gi c:\source | C:\users\Kim\Dpcuments\WindowsPowerShell\out-zip.ps1 c:\target\archive.zip"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .