Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 基于文件名的批处理移动,不带分隔符,仅限字符串_String_Windows_Batch File_Cmd_Delimiter - Fatal编程技术网

String 基于文件名的批处理移动,不带分隔符,仅限字符串

String 基于文件名的批处理移动,不带分隔符,仅限字符串,string,windows,batch-file,cmd,delimiter,String,Windows,Batch File,Cmd,Delimiter,好的,这里是Windows 7 Enterprise x64,还有一个Windows批处理文件问题。我是一个基本的用户,对批处理文件创建知之甚少。我已经修改了我在网上找到的现有脚本以供我使用,仅此而已。 我有一个软件,它将输出转储到一个文件夹中,文件夹的文件名由项目标题、当前系统日期、当前系统时间和项目设置连接而成 每次保存项目时,它将以这种格式导出两个文件: PROJECTTITLE_2016_10_07__09_45_11__A_B_C.iges PROJECTTITLE_2016_10_0

好的,这里是Windows 7 Enterprise x64,还有一个Windows批处理文件问题。我是一个基本的用户,对批处理文件创建知之甚少。我已经修改了我在网上找到的现有脚本以供我使用,仅此而已。

我有一个软件,它将输出转储到一个文件夹中,文件夹的文件名由项目标题、当前系统日期、当前系统时间和项目设置连接而成

每次保存项目时,它将以这种格式导出两个文件:

PROJECTTITLE_2016_10_07__09_45_11__A_B_C.iges
PROJECTTITLE_2016_10_07__09_45_11__A_B_C.step
A、B和C表示特定于项目的软件中使用的开关。这些文件可能存在,也可能不存在,因为文件名可以是_R_F或_R_F_Z等。 “PROJECTTITLE”可以是任何东西。这就是我使用分隔符的问题所在。您可能具有以下所有文件名(使用用户提供的真实示例):

我要做的是将IGES和STEP文件从C驱动器上的输出文件夹移动到网络驱动器上的一个新文件夹,该文件夹的名称基于“PROJECTTITLE”,必要时创建该文件夹。我已经将基于-delim的批处理任务安排为每晚运行,但发现分隔符不足以供我使用

虽然查找第一个下划线似乎很容易使用分隔符,但我有一些项目的名称中带有下划线,这会破坏文件夹命名。由于分隔符只适用于单个字符,而不适用于字符串,因此我一直在寻找批处理文件的示例,我可以根据自己的使用情况进行调整,但没有发现任何类似于我希望执行的不使用分隔符的操作

看起来很简单,在文件名中搜索字符串“_2016”,并获取“_2016”之前的所有字符,然后创建一个新目录,将包含这些字符的文件放在该文件夹中。但是,我不知道如何在没有分隔符的情况下执行此操作

到目前为止,我的工作是使用分隔符查找下划线,创建文件夹并移动到映射驱动器上的文件夹:

for /f "delims=_" %%V in ('dir /b /a-d C:\Output\*_*.iges') do (
 mkdir "I:\ENG\PARTS\%%V" 2>nul
 move "C:\Output\%%V_*.iges" "I:\ENG\PARTS\%%V" >NUL 2>nul
 move "C:\Output\%%V_*.step" "I:\ENG\PARTS\%%V" >NUL 2>nul
)
这是一个非常简单的批处理文件,但它的标题包含下划线

一些事情:

搜索
\u 2016
意味着批处理文件需要每年维护一次。我们可以搜索系统%YEAR%还是用正则表达式之类的东西搜索
“35;####u35;##u35;##
,以避免搜索系统日期或特定年份

编辑: 虽然开关很有用,但并不理想,但我在软件中找到了一种方法,不在文件名末尾导出特定于项目的开关。因此,现在的出口将是:

PROJECTTITLE_2016_10_07__09_45_11.iges
PROJECTTITLE_2016_10_07__09_45_11.step
我知道我可以从右边删减21个字符,用这个名字创建一个文件夹,然后在目录中搜索包含这个删减字符串的所有文件

尽管开关保持不变,但弄清楚如何搜索特定字符串仍然很好。我愿意学习,所以尽可能地向我解释你的代码

双(晚)编辑: 首先,谢谢大家的回答,我非常感谢你们的帮助


文件名中的双下划线非常罕见,但确实会发生,可能是因为打字错误。我计划用它移动的文件量越来越大,这就成了一个问题。该软件在大约100台用户机器上运行,其中20台左右为重用户,每天最多可保存1000个文件。当用户运行模拟时,软件将以增量自动保存。我试图给他们提供一种通过网络协作和查看彼此仿真结果的方法(我们积极鼓励他们使用这种方法),它表明软件是硬编码的,可以输出到C驱动器(如供应商告诉我的“性能”)。我正在研究如何安排文件在其OU中的每台PC上每15分钟移动一次,而不是每晚移动一次,以便近实时地查看他们在做什么

我探索的另一个选项是将每台机器上的输出文件夹象征性地链接到软件的文件夹网络驱动器,但发现这并不能解决用户的“组织”问题,将类似的项目运行放在同一个文件夹中。这还存在一个问题,即不允许他们在没有VPN的情况下将项目保存到办公室之外(有些用户确实这样做),然后在返回办公室时将文件移到办公室


感谢您的帮助。

即使文件名包含空格或
%
百分号等有毒字符,下一批脚本也应完成此工作

输出(请注意,运行的
mkdir
move
命令仅用于分别使用
ECHO mkdir
ECHO move
进行调试):

资源(必读,不完整):

  • (命令参考)
  • (其他特殊性)
  • %~nV
    %~xV
    等特殊页面)
  • 设置“\u fyear=%\u fyear:~0,4%”
    等)
  • %变量:strofind=NewStr%
    等)
@ECHO OFF
SETLOCAL
设置“sourcedir=U:\sourcedir”
设置“destdir=U:\destdir”
雷姆(
对于/f“delims=”%%a IN(
'dir/b/a-d”%sourcedir%\*\\\\\\*'
)做(
如果/i“%%~xa”=>.iges”调用:进程“%%a”
如果/i“%%~xa”==”。步骤“调用:进程”%%a”
)
REM)>%outfile%“
后藤:EOF
::进程文件名“%1”
:进程
设置“全名=%~1”
设置“垃圾=%fullname:*\ux=%”
调用集“项目=%%全名:%junk%%”
设置“项目=%project:~0,-13%
ECHO(MD“%destdir%\%project%”
回显(移动“%sourcedir%\%~1”%destdir%\%project%\”
后藤:eof
您需要更改
sourcedir
destdir
的设置以适应您的环境

所需的MD命令仅用于测试目的。
ECHO
ed。验证命令正确后,更改
ECH
PROJECTTITLE_2016_10_07__09_45_11.iges
PROJECTTITLE_2016_10_07__09_45_11.step
@ECHO OFF
SETLOCAL EnableExtensions DisableDelayedExpansion

set "_fouts=C:\Output"           your setting
set "_fouts=D:\test\39924063"    my setting 

for /F %%G in ('wmic OS get localdatetime ^|find "."') do set "_fyear=%%G"

pushd "%_fouts%"
  set "_fyear=%_fyear:~0,4%"
  call :doDir
  set /A _fyear -= 1
  call :doDir
popd

ENDLOCAL
goto :eof

:doDir
rem debugging output echo(%_fyear%
for /f "delims=" %%V in ('
  dir /b /a-d "*_%_fyear%_*.iges" "*_%_fyear%_*.step" 2^>NUL') do (
    set "_fname=%%~nV"           filename without extesion
    set "_fexte=%%~xV"           extesion only
    call :doAll
)
goto :eof

:doAll
    call set "_ftail=%%_fname:*_%_fyear%_=%%"
    call set "_fproj=%%_fname:_%_fyear%_%_ftail%=%%"
    rem debugging output echo("%_fproj%" "%_fname%" "%_fexte%"
    ECHO mkdir "I:\ENG\PARTS\%_fproj%" 2>nul
    ECHO move "%_fname%%_fexte%" "I:\ENG\PARTS\%_fproj%\"
goto :eof
==> dir /B /S "D:\test\39924063" /S
D:\test\39924063\#14drop_wire-edm_2016_10_07__09_45_11__R_F_Z.iges
D:\test\39924063\#14drop_wire-edm_2016_10_07__09_45_11__R_F_Z.step
D:\test\39924063\%PROJECT TITLE_2016_10_07__09_45_11__A_B_C.iges
D:\test\39924063\%PROJECT TITLE_2016_10_07__09_45_11__A_B_C.step

==> D:\bat\SO\39924063.bat
mkdir "I:\ENG\PARTS\#14drop_wire-edm"
move "#14drop_wire-edm_2016_10_07__09_45_11__R_F_Z.iges" "I:\ENG\PARTS\#14drop_wire-edm\"
mkdir "I:\ENG\PARTS\%PROJECT TITLE"
move "%PROJECT TITLE_2016_10_07__09_45_11__A_B_C.iges" "I:\ENG\PARTS\%PROJECT TITLE\"
mkdir "I:\ENG\PARTS\#14drop_wire-edm"
move "#14drop_wire-edm_2016_10_07__09_45_11__R_F_Z.step" "I:\ENG\PARTS\#14drop_wire-edm\"
mkdir "I:\ENG\PARTS\%PROJECT TITLE"
move "%PROJECT TITLE_2016_10_07__09_45_11__A_B_C.step" "I:\ENG\PARTS\%PROJECT TITLE\"

==>
@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion

(Set OutDir=I:\ENG\PARTS)
(Set SrcDir=C:\Output)

If Not Exist "%SrcDir%\" Exit/B 1
If Not Exist "%OutDir%\" Exit/B 1
For /F "EOL=Y" %%A In ('WMIC Path Win32_LocalTime Get Year') Do (
    For /F "Delims=" %%B In ("%%A") Do Set "ThisYr=%%B")
For /F "Delims=" %%A In ('Where "%SrcDir%:*_%ThisYr%_*.iges"') Do (
    If Exist "%%~dpnA.step" Call :Sub %%~nA)
Exit/B

:Sub
Set "BigTit=%~1"
For /F "Delims=" %%A In ('CMD /Q /C "Call Echo %%BigTit:_%ThisYr%_=&:%%"') Do (
    If Not Exist "%OutDir%\%%A\" MD "%OutDir%\%%A"
    Move "%SrcDir%\%~1*.*" "%OutDir%\%%A">Nul)