javascript - 如果传递了特殊字符,则 execsync 失败
问题描述
我正在尝试对视频文件运行一些命令进行处理。视频文件名可能包含特殊字符,如空格、' 和 " 等。因此,我的第一次尝试在多个文件上中断:
objMedInfo = JSON.parse(proc.execSync('mediainfo "' + currentfilename + '" --output=JSON').toString());
然后我想也许一种不同的格式会更健壮:
objMedInfo = JSON.parse(proc.execSync("mediainfo", [currentfilename,"--output=JSON"]).toString());
但是,它根本不会运行。有人可以帮忙吗?
(特别是,为什么第二种形式不起作用?)
解决方案
您需要转义引号并防止任何 cmd 注入 shinanigans。
function shellescape(a) {
let ret = []
a.forEach(function (s) {
if (/[^A-Za-z0-9_/:=-]/.test(s)) {
s = "'" + s.replace(/'/g, "'\\''") + "'"
s = s.replace(/^(?:'')+/g, '').replace(/\\'''/g, "\\'")
}
ret.push(s)
})
return ret.join(' ')
}
currentfilename = 'filenames"with\'quotesAnd Spaces;shutdown now;.jpg'
console.log('mediainfo ' + shellescape([currentfilename]) + ' --output=JSON')
// mediainfo 'filenames"with'\''quotesAnd Spaces;shutdown now;.jpg' --output=JSON
推荐阅读
- python - 如何从数据框的列创建动画折线图?
- javascript - 为什么 chrome 控制台在 {} + {} 和 {} + {} 之间给出不同的结果;
- python - 从 zonal_stats 我得到这个错误: ValueError: width and height must be > 0
- javascript - SyntaxError: await 仅在我的代码中的异步函数中有效
- web-services - ASMX WebService 没有从 xmlns:ns1 子命名空间获取请求值(xmlns:ns1 问题)
- c++ - 带数组的广播函数
- indexing - 最小值和最大值的八度代码以及查找索引
- c# - C# Winforms 应用程序中总进程内存使用情况的矛盾报告
- flutter - 修改默认的 ExpansionTile 子项垂直填充 Flutter
- mysql - 转移开始在我的 ASP.NET API 上花费的时间太长