2017-10-21 95 views
0

我需要通过创建新文件夹来移动文件。下面是编写的代码。这工作得很好。将文件名中的点和特殊字符替换到另一个位置之前

但是,如果文件名包含多余的点,空格和特殊字符(如圆括号),代码会失败。

请求您让我知道在将文件移动到目标位置之前如何替换/重命名点,空格和特殊字符。

if not exist "D:\KUMAR_398519667_9262017" mkdir D:\KUMAR_398519667_9262017 
move D:\%2 D:\KUMAR_398519667_9262017 

注意:%2是从触发过程传递到bat文件的文件名。

在此先感谢。

+1

没有理由额外的时间将永远具有影响在你的脚本上。空格,当然,但不是句号。始终将所有文件路径换成引号。 – SomethingDark

+0

@SomethingDark - 在调用代码中需要引号,而不一定在移动脚本中。请参阅[我的答案](https://stackoverflow.com/a/46864937/1012053) – dbenham

回答

0

简而言之引号的名称:

move "D:\%~2" "D:\KUMAR_398519667_9262017" 
0

问题最有可能的是不是你的“移动”脚本中,而是在被调用的“移动”的脚本代码。

不管何时你传递一个字符串字面量可能包含像<space><tab>=,像&;,,或特殊字符,那么你就应该附上引号中的参数标记分隔符。

假设你的脚本称为moveFile.bat,并要移动c:\some path with spaces\yourFile,那么你的电话应该是这样的:

call moveFile arg1 "some path with spaces\yourFile" 

你的脚本将然后正确地执行

move D:\"some path with spaces\yourFile" D:\KUMAR_398519667_9262017 

如果你忽略引用该论点,然后%2将被解析为c:\some,当然这将无法正常工作。

有人会说,你应该使用%~2,以消除任何现有的封闭引号,然后明确地添加自己周围的整个路径,如

move "D:\%~2" D:\KUMAR_398519667_9262017 

在这种情况下,执行命令变得更熟悉的期待

move "D:\some path with spaces\yourFile" D:\KUMAR_398519667_9262017 

这当然也可以,但是没有必要。

整体设计存在一个潜在的问题 - 它不能支持既包含空格又包含插入符号(^)的路径,因为必须引用路径,但CALL语句将有效地将所有引用的插入符号加倍。

所以call moveFile arg1 "some path with spaces\A^B.txt"会导致以下:

move D:\"some path with spaces\A^^B.txt" D:\KUMAR_398519667_9262017 

绝对没有,你可以做些什么来防止引用插入符号,当您使用CALL加倍 。最好的选择是通过引用传递你的路径作为变量名。显然这需要改变moveFile。蝙蝠:

这里有必要的修改,以moveFile.bat:

setlocal enableDelayedExpansion 
if not exist "D:\KUMAR_398519667_9262017" mkdir D:\KUMAR_398519667_9262017 
move "D:\!%2!" D:\KUMAR_398519667_9262017 

而且你的代码调用moveFile应该是这样的:

set "myFile=some path with spaces\A^B" 
call moveFile arg1 myFile 
+0

嗨dbenham,感谢您的详细回复,它似乎是调用过程的问题,我从Siebel escript调用bat文件。在将双引号添加到bat文件脚本后,它在通过cmd运行以及双击时正常工作。但是当试图从siebel脚本执行bat文件时,这同样不起作用。 Siebel代码如下 – Kumar

+0

Siebel代码如下:“batstatus = Clib.system(”D:\\ MoveFiles.bat“+”“+ sDestDir +”“+ sUnCompFilePath);”其中sDesDir是目标目录参数,sUnCompFilePath是文件路径。谢谢。 – Kumar

+0

@Kumar - 尝试在Siebel中构建完整的字符串,然后将其打印到屏幕或文件中,而不执行。一旦你得到正确的语法,然后将该字符串传递给'Clib.system()'。 – dbenham