助手文件括号不结转
Helper file parentheses not carrying over
我这辈子都做不到。发生的事情是我正在将 .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)
这是我希望看到的结果(在末尾的第一行有一个“)”符号。)
'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 函数。
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 搜索的目录序列,如果在当前目录中找不到可执行文件,则查找该可执行文件。更改它后果自负。
您是否知道 setlocal
命令之前的值 set
永久 set
到此会话的环境中?
在您的 for /f
目录扫描中检查 source
而不是 destination
更为正常。
在 for
循环中使用标签几乎肯定会带来麻烦。我怀疑你已经删除了(在生成最小脚本时完全可以接受)for
循环中的重要 goto unzip
语句(你不能 goto
[=18= 中的目的地]循环。)
并且您的 endlocal
应该在 for
循环的 外部 ,否则它会为调用的每个循环值执行。
最后,你知道吗
> %temp%\unzip.vbs echo ^'test
(注意单个 >
)将启动一个新文件 %temp%\unzip.vbs
,替换任何现有版本?这可能会为您节省门控删除(但您需要在 for
循环关闭后删除文件 [如果您愿意])
这里有一个 batch-file 选项,我认为你想做的是:
<!-- :
@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
代码以适合您的确切目的,但这应该为您提供了一种方法。
我这辈子都做不到。发生的事情是我正在将 .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)
这是我希望看到的结果(在末尾的第一行有一个“)”符号。)
'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 函数。
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 搜索的目录序列,如果在当前目录中找不到可执行文件,则查找该可执行文件。更改它后果自负。
您是否知道 setlocal
命令之前的值 set
永久 set
到此会话的环境中?
在您的 for /f
目录扫描中检查 source
而不是 destination
更为正常。
在 for
循环中使用标签几乎肯定会带来麻烦。我怀疑你已经删除了(在生成最小脚本时完全可以接受)for
循环中的重要 goto unzip
语句(你不能 goto
[=18= 中的目的地]循环。)
并且您的 endlocal
应该在 for
循环的 外部 ,否则它会为调用的每个循环值执行。
最后,你知道吗
> %temp%\unzip.vbs echo ^'test
(注意单个 >
)将启动一个新文件 %temp%\unzip.vbs
,替换任何现有版本?这可能会为您节省门控删除(但您需要在 for
循环关闭后删除文件 [如果您愿意])
这里有一个 batch-file 选项,我认为你想做的是:
<!-- :
@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
代码以适合您的确切目的,但这应该为您提供了一种方法。