辅助文件括号不保留

时间:2019-04-26 21:43:58

标签: windows batch-file cmd windows-console

我一生都无法正常工作。发生了什么事,我正在将.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 :(得分:0)

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在{{1} }循环。)

,并且您的for应该在endlocal循环的外部内,否则对于调用的每个循环值都会被提取。

最后,您知道吗

for

(请注意单个> %temp%\unzip.vbs echo ^'test )将启动一个新文件>,替换任何现有版本吗?这可以为您节省门控删除操作(但是,%temp%\unzip.vbs循环关闭后,[如果需要,您需要删除文件)

答案 1 :(得分:0)

以下是我认为您要尝试的操作

<!-- :
@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代码以适合您的确切目的,但这应该为您提供一种方法。