所以这个描述有点含糊,所以我会用一张图片:
我有大约150个与SVG具有相同内容的DWG文件(它们都是1到1的矢量绘图格式)。我想将相同的文件名从DWG应用到以相同数字开头的SVG。
所以我最终得到了:
001_TERMINAL.dwg
001_TERMINAL.svg
002_DIFFUSER.dwg
002_DIFFUSER.svg
...诸如此类
我正在使用装有Windows 10的电脑。
如何实施问题解决方案? 谢谢!
答案 0 :(得分:1)
假设* .svg文件名中总是有3位数字:
set DIR=C:\mydir
@rem Allow repeated setting of !variables! in the FOR loop below
setlocal enabledelayedexpansion
for %%I in (%DIR%\*.dwg) do (
@rem "~n" to pick out just the filename part of the %%I variable
set BASENAME=%%~nI
@rem Substring - batch file style
set PREFIX=!BASENAME:~0,3!
echo !PREFIX! ... !BASENAME!
rename !PREFIX!.svg !BASENAME!.svg
)
请注意,这需要在批处理文件中才能使%%I
生效。
主要的复杂因素是在多行FOR循环中使用变量。
对于这些,您必须使用延迟扩展选项,以便每次都可以扩展变量,而不是在解析行时。这意味着您必须在批处理文件中使用!variable!
而不是更正常的%variable%
。
答案 1 :(得分:0)
使用bash:
#!/bin/bash
for f in *.dwg; do
IFS='_' read -r -a arr <<< "$f"
mv ${arr[0]}.svg ${f%.*}.svg
done
答案 2 :(得分:0)
因为您使用的是Windows,所以PowerShell是解决此问题的绝佳选择。
对于下面的脚本,下划线字符前面的数字部分的长度并不重要,只要.dwg文件名中有下划线,如问题中所示。
只需更换&#39; c:\ folder&#39;下面是文件存储路径。
$folderPath = "c:\folder"
$files = Get-ChildItem ([System.IO.Path]::Combine($folderPath, "?*_*.dwg"))
for ($i=0; $i -lt $files.Count; $i++)
{
$file = $files[$i]
$dwgFileName = $file.BaseName
$index = $dwgFileName.IndexOf("_")
$numberPart = $dwgFileName.Substring(0, $index)
$svgFilePath = [System.IO.Path]::Combine($folderPath, "$numberPart.svg")
if ([System.IO.File]::Exists($svgFilePath))
{
Rename-Item -Path $svgFilePath -NewName "$dwgFileName.svg"
}
}