我有一个Windows CMD脚本,它在我们的Wintel庄园的许多机器上处理文件,并将它们输入我们的SFTP网关。
作业需要多个参数来确定在给定目录中处理哪些文件。 当作业执行时,它会扫描目录以查找与正则表达式%FM_PREF%(文件目前缀)和%FM_SUFF%(文件掩码后缀)匹配的文件,并继续存储"最老的" filename作为变量("%FILE_IN_PROCESS")
这是通过以下方式实现的:
for /F "usebackq delims=" %%f in (`dir /b /o:-d "%FM_PREF%"*."%FM_SUFF%"`) do set FILE_IN_PROCESS=%%f
然后通过检查以下内容的%ERRORLEVEL%来检查它是否可以对文件进行独占锁定:
echo.N|copy /-y NUL "%FILE_IN_PROCESS%" 1>NUL 2>NUL
我刚刚遇到的问题是我被要求使用此过程来处理打印服务器上的文件,而正在创建的文件在文件名中包含空格。
不是一个大问题,因为我可以简单地重命名"%FILE_IN_PROCESS%"通过donig这个:
echo %FILE_IN_PROCESS% | find " "
if %ERRORLEVEL% EQU 0 cmd /e:on /v:on /c "for %f in ("%FILE_IN_PROCESS%") do (set "n=%~nxf" & set "n=!n: =_!" & ren "%~ff" "!n!" )"
挑战在于我想要的价值!要返回到父进程,以便我可以将%FILE_IN_PROCESS%变量重置为新文件名(已将空格转换为下划线)
我被困......并且作为Unix系统管理员已经20多年了,Windows / DOS / CMD文件不是我的专业领域。
是否可以将值返回到生成" cmd /e......"的原始作业;命令,还是我必须编写一个讨厌的解决办法,比如在磁盘上创建一个临时文件并将其读回到%FILE_IN_PROCESS%变量中?
建议赞赏???
@jeb回答 我创建了一个缩短版的脚本,名为" dave.cmd"
setlocal EnableDelayedExpansion
set FM_PREF=TNO_A4
set FM_SUFF=tno
for /F "usebackq delims=" %%f in (`dir /b /o:-d "%FM_PREF%"*."%FM_SUFF%"`) do set FILE_IN_PROCESS=%%f
echo.
echo pre FILE_IN_PROCESS=%FILE_IN_PROCESS%
echo.
echo "%FILE_IN_PROCESS%" | find " " 1> NUL 2>NUL
if %ERRORLEVEL% EQU 0 (
set "newName=!FILE_IN_PROCESS: =_!"
ren "!FILE_IN_PROCESS!" "!newName!"
)
set FILE_IN_PROCESS=%newName%
echo post FILE_IN_PROCESS=%FILE_IN_PROCESS%
然后表明它有效:
C:\temp\space>date /t > "TNO_A4 a b c dave.tno"
C:\temp\space>.\dave.cmd
pre FILE_IN_PROCESS=TNO_A4 a b c dave.tno
post FILE_IN_PROCESS=TNO_A4_a_b_c_dave.tno
C:\temp\space>
答案 0 :(得分:0)
我看不出你为什么需要它? 您不需要启动子cmd,您可以在同一批处理环境中执行此操作。
setlocal EnableDelayedExpansion
...
if %ERRORLEVEL% EQU 0 (
set "newName=!FILE_IN_PROCESS: =_!"
ren "!FILE_IN_PROCESS!" "!newName!"
)
但后来我想知道你是否可以使用未修改的名字?