Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.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
Batch file 如何清理.bat脚本中作为参数提供的文件路径(后退/前进斜杠),以避免语法错误_Batch File_Batch Rename - Fatal编程技术网

Batch file 如何清理.bat脚本中作为参数提供的文件路径(后退/前进斜杠),以避免语法错误

Batch file 如何清理.bat脚本中作为参数提供的文件路径(后退/前进斜杠),以避免语法错误,batch-file,batch-rename,Batch File,Batch Rename,我有一个简单的.bat脚本,它使用ren重命名文件夹中的所有文件。输入参数是包含要重命名文件的文件夹的路径。脚本有时会返回语法错误,我们可以追溯到这样一个事实:有时输入路径有正斜杠、反斜杠或两者的混合(有时以双正斜杠开始)。我们希望通过允许该脚本接受这些类型的路径中的任何一种,并在调用ren命令之前将路径作为.bat脚本的一部分进行清理,使该脚本更加健壮 因此,我的问题是:在调用ren函数之前,是否有一(组)命令可以应用于文件路径参数(%1,在下面的示例中),该函数将纠正所有前向/后向斜杠,使其

我有一个简单的.bat脚本,它使用
ren
重命名文件夹中的所有文件。输入参数是包含要重命名文件的文件夹的路径。脚本有时会返回语法错误,我们可以追溯到这样一个事实:有时输入路径有正斜杠、反斜杠或两者的混合(有时以双正斜杠开始)。我们希望通过允许该脚本接受这些类型的路径中的任何一种,并在调用
ren
命令之前将路径作为.bat脚本的一部分进行清理,使该脚本更加健壮

因此,我的问题是:在调用
ren
函数之前,是否有一(组)命令可以应用于文件路径参数(
%1
,在下面的示例中),该函数将纠正所有前向/后向斜杠,使其一致并避免语法错误?我对.bat脚本没有太多经验,所以任何代码示例都会很有帮助

@echo off
setlocal ENABLEDELAYEDEXPANSION
for %%F in (%1*.nc) do (
   for /F "tokens=1-8 delims=_" %%a in ("%%~nF") do (
   ren "%%F" "%%a_%%b_%%c_%%d_%%e_%%g_%%f_%%h.nc"
   ) 
) 
更新:最后,只需要Magoo的最后一个建议,因为将
%1
更改为
“%~f1”
修复了斜杠问题。我还必须将
%~f1\
添加到
ren
命令的第一个参数中,因为否则它在错误的文件夹中查找(第一个
for
发现文件正常,但
ren
命令在错误的文件夹中查找

@echo off
setlocal ENABLEDELAYEDEXPANSION
for /F "delims=" %%F in ('dir /b /a-d "%~f1\*.nc"') do (
   for /F "tokens=1-8 delims=_" %%a in ("%%~nF") do (
   ren "%~f1\%%~nF.nc" "%%a_%%b_%%c_%%d_%%e_%%g_%%f_%%h.nc"
   ) 
) 
然后使用
%corrected%
代替
%1
,并
引用文件名
,因此:

for %%F in ("%corrected%*.nc") do (
如果
%1
始终是目录名,则添加

if "%corrected:~-1%" neq "\" set "corrected=%corrected%\"
作为第三个
行,在
for
行之前设置

第一个
集合
%1
的值分配给一个变量
已更正
~
将删除任何括起来的引号

第二个
集合
将变量中与
=
匹配的所有字符串更改为
=
%
之间的字符串,并分配给第一个提到的变量(可以是相同的变量,如本例所示)

第三个
集合
(如果使用)检查最后一个字符是否为
\
,如果不是,则附加一个
\

引用文件名字符串允许路径/文件名中有空格,如果没有空格,则不会产生任何影响

避免尝试重命名文件两次,而不是

for %%F in ("%corrected%*.nc") do (
使用


这将在内存中建立一个文件名列表,然后处理该列表。

这几乎可以工作了,谢谢!我认为最后一步可能不是100%正确-这似乎是在添加第二个\时,路径末尾已经有一个\了…脚本有时似乎会将其中一个文件重命名两次-不知何故,循环正在选择已经存在的文件-第二次重命名文件。批处理对布局非常敏感。最好是复制粘贴,而不是尝试重新键入。添加额外的“\”
问题可能是我发布的内容和您的代码之间存在差异。同样,替换
行的
对几乎所有内容都很敏感。例如,引号和引号类型……我仍在努力实现这一点。您建议的最后一行代码应该替换我纸条中的这一行代码,对吗对于(%1*.nc)中的%%F,t?
执行(
而我的脚本的其余部分保持不变?因此基本上我有两个“for/F”语句,一个嵌套在另一个中?啊,是的!很好的观察到,
echo%~f1
纠正了斜杠问题…每次我没有真正测试代码时都会发生-我已经多年没有接触过*Nix了,所以我从一开始就不会尝试使用
//code>。。。
for %%F in ("%corrected%*.nc") do (
for /F "delims=" %%F in ('dir /b /a-d "%corrected%*.nc"') do (