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

How to pass a single quote (') into a batch script?

您好,感谢您的帮助。

我在 Windows 批处理脚本中转义单引号字符 (') 时遇到困难。我试过 ^'、\'、'''、'\'' 等等。网上搜索也没有解决。我被难住了。

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

@echo off
du -sk ./*  | sort -nr | head -40 | gawk '{printf("%%^'14d kB %%s %%s %%s %%s %%s %%s %%s %%s\n", , , , , , , , , )}'

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

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", , , , , , , , , )}'

开头的格式字符串 (%'14d) 告诉 gawk 在打印整数时使用逗号(“123456789”打印为“123,456,789”)。 这个字符串有一个单引号 ('),我不知道如何正确地传递到批处理脚本中。

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

感谢任何帮助。

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

gAwk 在 POSIX-compliant、Bourne-style 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\", , , , , , , , , )}"

以上建议适用于cmd.exe;但是,当 运行 来自批处理文件时,还有一个问题。

所有百分号字符都需要加倍! % 变成 %%.

鉴于以上所有内容,请记住这是完全未经测试的,您在批处理文件中的命令将是:

du -sk ./*  | sort -nr | head -40 | gawk "{printf(\"%%'14d kB %%s %%s %%s %%s %%s %%s %%s %%s\n\", , , , , , , , , )}"