为什么批处理文件在某些​​机器上不能按预期工作之前工作?

时间:2017-10-16 08:26:05

标签: batch-file

我的批处理脚本已经运行了几个月。该脚本的目的是根据文件名创建一个文件夹,并根据特定目的相应地重命名该文件夹。但是,它会停止将文件移动到循环中创建的文件夹中。我在其他机器上进行了测试,它工作正常,但在特定的机器上;它只是不起作用。

我可以做些什么来使循环生效以及为什么批量在工作了几个月后停止工作(将文件移动到文件夹)?

setlocal EnableDelayedExpansion

for /F %%a in ('dir "C:\Program Files\WinSCP\Unconverted" /a-d /b') do (
    if not "%%~dpnxa"=="%~dpnx0" call :func "%%~a"

:func
set file=%~1
set dir=%file:~0,49%
mkdir "C:\Program Files\WinSCP\Unconverted\%dir%_fdc" 2>nul

rem ECHO "%file%"
rem ECHO "C:\Program Files\WinSCP\Unconverted\%dir%_fdc" 

move /Y "C:\Program Files\WinSCP\Unconverted\%file%" "C:\Program Files\WinSCP\Unconverted\%dir%_fdc"  
)

start "" "C:\Program Files\WinSCP\hide_conversion_window.exe"

2 个答案:

答案 0 :(得分:1)

我重写并批评了批处理文件,因为它包含几个问题,只要这个批处理文件存储在%ProgramFiles%\WinSCP\Unconverted中,大多数问题都没有问题,而且这个目录也是执行批处理文件的当前目录。双击批处理文件。

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "SourceFolder=%ProgramFiles%\WinSCP\Unconverted"

rem Process all files in source folder found by command DIR with ignoring
rem subfolders and listed in bare format which means only file names with
rem file extension but without file path. The batch file itself is skipped
rem if being also stored in the source folder specified above.

for /F "delims=" %%I in ('dir "%SourceFolder%\*" /A-D /B 2^>nul') do (
    if /I not "%SourceFolder%\%%I"=="%~f0" call :MoveFile "%SourceFolder%\%%I"
)

rem Execute converter through AutoIt in a separate command process and
rem while conversion is running continue with batch processing which means
rem restoring previous environment and finally exiting batch file processing.

start "" "%ProgramFiles%\WinSCP\hide_conversion_window.exe"
endlocal
goto :EOF

rem MoveFile is a subroutine which expects to be called with one argument
rem being the name of the file to move with full file name which means
rem with file path, file name and file extension.

rem The first 49 characters of the file name define the name for target
rem folder on which "_fdc" must be appended for completion. This folder
rem is created without verification on success and then the file is
rem moved into this folder again without verification on success.

:MoveFile
set "FileName=%~nx1"
set "FolderName=%FileName:~0,49%_fdc"
mkdir "%~dp1\%FolderName%" 2>nul
move /Y "%~1" "%~dp1\%FolderName%\" >nul
goto :EOF

此批处理文件适用于存储在与源文件夹不同的文件夹中的批处理文件,或者当前目录与包含批处理文件的文件夹不同,或者找到的文件包含空格字符或任何其他特殊字符,如{{1 }}

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • &()[]{}^=;!'+,`~
  • call /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • mkdir /?
  • move /?
  • set /?
  • setlocal /?

另请阅读Microsoft有关Using Command Redirection Operators

的文章

答案 1 :(得分:0)

感谢oldabi的建议。有时候事情确实有效,而且我们在想它是完美的,直到它崩溃。谢谢你的建议。我刚刚意识到我错过了支架的错误。

    SETLOCAL ENABLEDELAYEDEXPANSION

for /F %%a in ('dir "C:\Program Files\WinSCP\Unconverted" /a-d /b') do (
  if not "%%~dpnxa"=="%~dpnx0" call :func "%%~a" )

goto conversion

  :conversion
rem ::execute converter through autoit
start "" "C:\Program Files\WinSCP\hide_conversion_window.exe"


:func
set file=%~1
set dir=%file:~0,49%
mkdir "C:\Program Files\WinSCP\Unconverted\%dir%_fdc" 2>nul

rem  ECHO "%file%"
rem ECHO "C:\Program Files\WinSCP\Unconverted\%dir%_fdc" 

MOVE /Y "C:\Program Files\WinSCP\Unconverted\%file%" "C:\Program Files\WinSCP\Unconverted\%dir%_fdc"