如何将单引号(')传递给批处理脚本?

时间:2018-03-16 06:19:46

标签: windows batch-file awk gawk

您好,感谢您的帮助。

我很难在Windows Batch脚本中转义单引号字符(')。我试过^','',''','\''等等。在线搜索也没有解决它。我很难过。

此脚本使用cgywin64 gawk格式化文件夹列表:

@echo off
du -sk ./*  | sort -nr | head -40 | gawk '{printf("%%^'14d kB %%s %%s %%s %%s %%s %%s %%s %%s\n", $1, $2, $3, $4, $5, $6, $7, $8, $9)}'

运行时,它会给我以下错误:

gawk: cmd. line:1: {printf("%^14d
gawk: cmd. line:1:         ^ unterminated string
gawk: cmd. line:1: {printf("%^14d
gawk: cmd. line:1:         ^ syntax error

不执行任何字符转义,gawk命令看起来像:

gawk '{printf("%'14d kB %s %s %s %s %s %s %s %s\n", $1, $2, $3, $4, $5, $6, $7, $8, $9)}'

开头的格式字符串(%'14d)告诉gawk在打印整数时使用逗号(“123456789”打印为“123,456,789”)。 这个字符串有一个引号('),我无法弄清楚如何在没有错误的情况下传入批处理脚本。

那么如何将单引号(')传递给批处理脚本?

任何帮助表示感谢。

1 个答案:

答案 0 :(得分:0)

以下建议未经测试,目前基于我的有限理解。

gAwk使用单引号引用符合POSIX标准的Bourne样式的shell,其中cmd.exe不是一个。

使用cmd.exe时,用于引用的单引号'需要用双引号"替换。

不用于引用的单引号%'14d不需要gAwk特别注意,因为双引号内的字符受到保护。

在cmd.exe中,单引号没有问题,因此该字符可以保持不变。

因此,在cmd.exe中,您需要用双引号'{}'替换周围的单引号"{}"

然后你必须转义内部双引号以防止cmd.exe过早地关闭开头的"{

在cmd.exe中,双引号通常在前面加上反斜杠\"进行转义。

cmd.exe中的命令如下所示:

du -sk ./*  | sort -nr | head -40 | gawk "{printf(\"%'14d kB %s %s %s %s %s %s %s %s\n\", $1, $2, $3, $4, $5, $6, $7, $8, $9)}"

上面的建议适用于cmd.exe;但是当从批处理文件运行时,还有一个额外的问题。

所有百分比字符都需要加倍! %变为%%

所以考虑到上述所有情况,记住这是完全未经测试的,您在批处理文件中的命令将是:

du -sk ./*  | sort -nr | head -40 | gawk "{printf(\"%%'14d kB %%s %%s %%s %%s %%s %%s %%s %%s\n\", $1, $2, $3, $4, $5, $6, $7, $8, $9)}"