Скобки вспомогательного файла не переносятся - PullRequest
0 голосов
/ 27 апреля 2019

Я не могу на всю жизнь заставить это работать правильно. Что происходит, я пишу файл .vbs в папку% temp% в качестве вспомогательного файла. Тогда я звоню. Это все работает, за исключением того, что один символ ")" не переносится.

set "path=\\server1\folder\folder\folder\dest-folder"
set source=^"%path%\nwm*.zip^"
set destination=%path%

setlocal
for /f "tokens=* delims=" %%a in ('dir/b "%destination%\nwm*.zip"') do (
    set source=%%a
    :unzip
    >> %temp%\unzip.vbs echo ^'test
    >> %temp%\unzip.vbs echo call WindowsUunzip(%source%,"%destination%")
    >> %temp%\unzip.vbs echo Function WindowsUunzip(sUunzipFileName, sUunzipDestination)

    C:\windows\system32\cscript //nologo %temp%\unzip.vbs
    pause
    if exist "%temp%\unzip.vbs" del /f /q "%temp%\unzip.vbs"
    endlocal
)

Вот результат, который я получаю:

'test
call WindowsUunzip("\\server1\folder\folder\folder\dest-folder\nwm*.zip","\\server1\folder\folder\folder\dest-folder"
Function WindowsUunzip(sUunzipFileName, sUunzipDestination)

Это результат, который я хотел бы видеть символом (A ")" в первой строке в конце.)

'test
call WindowsUunzip("\\server1\folder\folder\folder\dest-folder\nwm*.zip","\\server1\folder\folder\folder\dest-folder")
Function WindowsUunzip(sUunzipFileName, sUunzipDestination)

Что я уже пробовал:

  • Использование @echo, echo (, echo:
  • избегая всех скобок
  • Добавление дополнительных строк кода только для наблюдения за поведением.
  • удаление цикла for работает нормально, но мне нужно перебирать файлы и вызывать эту функцию VBS для каждого файла.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2019

Вот вариант для того, что, я думаю, вы пытаетесь сделать:

<!-- :
@Echo Off
Set "destination=\\server1\folder\folder\folder\dest-folder"
Set "file-mask=nwm*.zip"
For /F "Delims=" %%A In ('Where "%destination%":"%file-mask%"'
)Do CScript //NoLogo "%~f0?.wsf" "%%A" "%destination%"
Exit /B
-->
<Job><Script Language="VBScript">
    Unzip WScript.Arguments(0), WScript.Arguments(1)
    Sub Unzip(sSource, sTargetDir)
        Set oFSO = CreateObject("Scripting.FileSystemObject")
        If Not oFSO.FolderExists(sTargetDir) Then oFSO.CreateFolder(sTargetDir)
        Set oShell = CreateObject("Shell.Application")
        Set oSource = oShell.NameSpace(sSource).Items()
        Set oTarget = oShell.NameSpace(sTargetDir)
        oTarget.CopyHere oSource, 256
    End Sub
    </Script></Job>

Очевидно, что вы можете настроить свой код VBScript в соответствии с вашими задачами, но это должно предложить вам методологию.

0 голосов
/ 27 апреля 2019
set "Xpath=\\server1\folder\folder\folder\dest-folder"
set source=^"%Xpath%\nwm*.zip^"
set destination=%Xpath%

setlocal
for /f "tokens=* delims=" %%a in ('dir/b "%destination%\nwm*.zip"') do (
    >> %temp%\unzip.vbs echo ^'test
    >> %temp%\unzip.vbs echo call WindowsUunzip(%%a,"%destination%"^)
    >> %temp%\unzip.vbs echo Function WindowsUunzip(sUunzipFileName, sUunzipDestination^)

    C:\windows\system32\cscript //nologo %temp%\unzip.vbs
    pause
    if exist "%temp%\unzip.vbs" del /f /q "%temp%\unzip.vbs"
)
endlocal

PATH - это последовательность каталогов, которую Windows ищет, чтобы найти исполняемый файл, если он не найден в текущем каталоге. Вы меняете это на свой страх и риск.

Известно ли вам, что значения set перед командой setlocal постоянно set входят в среду этого сеанса?

Более нормально проверять source, а не destination для файлов в for /f сканировании каталогов.

Использование метки в цикле for почти гарантированно создает проблемы. Я подозреваю, что вы подвергли цензуре (вполне приемлемо при создании минимального скрипта) существенный оператор goto unzip в цикле for (вы не можете goto пункт назначения в цикле for.)

и ваш endlocal должен быть вне цикла for, в противном случае он будет отображаться для каждого вызванного значения цикла.

Наконец, знаете ли вы, что

> %temp%\unzip.vbs echo ^'test

(обратите внимание на один >) запустит новый файл %temp%\unzip.vbs, заменив любую существующую версию? Это может сэкономить вам gated-delete (но вам нужно будет удалить файл [если вы того пожелаете] после закрытия цикла for)

...