使用 CMD /c 时如何绕过字符限制?
Posted
技术标签:
【中文标题】使用 CMD /c 时如何绕过字符限制?【英文标题】:How to Bypass Character Limit When Using CMD /c? 【发布时间】:2015-11-27 09:42:34 【问题描述】:我正在 Windows 7 中编写一个命令行批处理脚本来上传多个图像以进行托管,将 url(使用 this program)和文件名粘贴到一行文本中,然后将文本附加到文件中。
下面的代码给了我一个错误,因为命令“cmd /c”太长了。
@echo on
set DIR1="C:\Users\My\Desktop\temp"
set DIR2="C:\Misc\Programs\EasyImgur"
set DIR3="C:\Users\My\Desktop"
set DIR2=%DIR2:"=%
set DIR3=%DIR3:"=%
forfiles /m *.png /p %DIR1% /c "cmd /c %DIR2%\EasyImgur.exe /anonymous @path && timeout /t 2 /nobreak > NUL && paste > %DIR3%\temp.txt && set /p URL= < %DIR3%\temp.txt && echo if(G9="@fname",IMAGE(%URL%,3), >> %DIR3%\test.txt"
del %DIR3%\temp.txt
pause
exit
有没有办法解决这个问题?有什么方法可以在“cmd /c”之后调用所有文本而不打破字符限制?我需要为目录中的每个文件完成所有这些操作。
提前致谢。
【问题讨论】:
使用 PowerShell 还是 msys? (我不是真的在开玩笑。) 如果您使用for
而不是forfiles
,您可以将命令转换为子程序。 (见call /?
)
好吧,for
工作得更好,因为它没有字符限制。我现在唯一的问题是为什么以下行不从 .txt 导入:paste > temp.txt && set /p URL=< temp.txt && echo %URL%
它确实写入了 .txt 文件,但为什么不能将其导入 URL 变量?
环境变量在循环执行前展开。参见例如***.com/a/6500797/886887;您可以使用延迟扩展(根据链接的答案)或使用子例程来解决问题。
如此接近!我使用了延迟扩展,我得到了我想要的确切文本,但它被引号包围了。如何仅删除周围的引号,而不是内部的引号?下面的文本被设置为一个名为 TEXT 的变量。我的结果如下:"if(G11="Akadi",IMAGE(http://i.imgur.com/mr7GBBD.png,3),"
【参考方案1】:
感谢 Harry Johnston 的帮助,我明白了!看看吧。
代码是:
@echo off
setlocal EnableDelayedExpansion
set "DIR1=C:\Users\RyzaJr\Desktop\temp"
set "DIR2=C:\Misc\Programs\EasyImgur"
for %%a in (%DIR1%\*.png) do (
"%DIR2%\EasyImgur.exe" /anonymous "%%a"
timeout /t 4 /nobreak > NUL
paste > temp.txt
set /p URL= < temp.txt
echo if(G11="%%~na",IMAGE(!URL!,3^), >> "output.txt"
)
del temp.txt
exit
【讨论】:
【参考方案2】:这可能对您有用 - 您在文件中回显的术语与括号不匹配。
@echo on
set "DIR1=C:\Users\My\Desktop\temp"
set "DIR2=C:\Misc\Programs\EasyImgur"
set "DIR3=C:\Users\My\Desktop"
for %%a in ("%DIR1%\*.png") do (
start "" /w /b "%DIR2%\EasyImgur.exe" /anonymous "%%a"
set "flag="
for /f "delims=" %%b in ('paste') do (
if not defined flag >>"%DIR3%\test.txt" echo if(G9="%%~na",IMAGE(%%b,3^),
set flag=1
)
)
pause
【讨论】:
你的答案真的很接近工作,但它需要超时,因为它上传到 imgur 的速度不够快,所以 URL 是错误的。是的,我知道不匹配的括号。我是故意这样做的,因为 if() 参数会相互嵌套。 带有 /wait 开关的启动命令应该会停止批处理文件的运行,直到命令完成。可能 easyimgur.exe 的行为不像普通命令行工具应有的行为 - 或者粘贴工具(可能是剪贴板读取实用程序)有问题。但是如果你把 timeout 命令放回去,它是否可以正常工作?以上是关于使用 CMD /c 时如何绕过字符限制?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Dataset.groupByKey 时如何绕过 2GB 缓冲区限制?
仅使用蓝牙时,iOS Multipeer 连接将对等点数量限制为 6 个,无论如何要绕过它?