无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 5010|回复: 24
打印 上一主题 下一主题

[求助] 求关于在一个字符串末尾添加n个空格的批处理代码?

[复制链接]
跳转到指定楼层
1#
发表于 2013-5-19 01:53:53 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
求关于在一个字符串末尾添加n个空格的批处理代码?
比如说a=123 想在a后面添加3个"空格",批处理代码怎么写?
我自己想了一种方法:
set a=123
set n=3

:b
set a=%a%"空格"
set /a n=%n%-1
if "%n%"=="0" || goto:b ! exit

还有没有其他写法??
2#
发表于 2013-5-19 08:13:42 | 只看该作者
本帖最后由 chenall 于 2013-5-19 08:15 编辑

内置printf函数
在变量a后面添加3个空格,要N个空格就Ns
call Fn.0 0 "%a%%3s" | set a=

我猜测你有可能需要对齐..

比如6个字符左对齐.如果A里面只有三个字符,后面就会多出3个空格.如果是4个字符就有2个空格.
call Fn.0 0 "%-6s" "%a%"
回复

使用道具 举报

3#
 楼主| 发表于 2013-5-19 22:25:54 | 只看该作者
本帖最后由 zbkh 于 2013-5-19 22:28 编辑
chenall 发表于 2013-5-19 08:13
内置printf函数
在变量a后面添加3个空格,要N个空格就Ns
call Fn.0 0 "%a%%3s" | set a=


恩,就是想对齐!呵呵,非常感谢!

哦,对了,关于内置函数,有相关的学习资料吗?我想看看,学学!
回复

使用道具 举报

4#
发表于 2013-5-20 09:05:46 | 只看该作者
内部函数调用方法.
call Fn.N 参数1 参数2 参数3....最多9个.
N是对应函数编号.

懂得C语言的,自己看grub4dos.h文件就明白了...
回复

使用道具 举报

5#
 楼主| 发表于 2013-5-20 09:34:09 | 只看该作者
本帖最后由 zbkh 于 2013-5-20 10:32 编辑
chenall 发表于 2013-5-20 09:05
内部函数调用方法.
call Fn.N 参数1 参数2 参数3....最多9个.
N是对应函数编号.


恩,谢谢! 不过不好意思,我找了找,没发现grub4dos.h,麻烦chenall告知这个文件在什么地方可以找到!谢谢!
回复

使用道具 举报

6#
 楼主| 发表于 2013-5-21 15:47:21 | 只看该作者
chenall 发表于 2013-5-19 08:13
内置printf函数
在变量a后面添加3个空格,要N个空格就Ns
call Fn.0 0 "%a%%3s" | set a=


你好,有点不太好意思!还想请教如果是左边补空格,右边对齐的话,应该怎么样调用内置函数???
期望chenall能够列举几个在批处理当中经常有用到的内置函数用法举例,我想很多人都会非常开心!呵呵!

点评

Google 一下C语言printf的用法...GRUB4DOS内置函数的用法基本上都是类似的,查找一下C语言对应的用法.  发表于 2013-5-21 16:23
回复

使用道具 举报

7#
发表于 2013-5-21 16:09:01 | 只看该作者
zbkh 发表于 2013-5-21 15:47
你好,有点不太好意思!还想请教如果是左边补空格,右边对齐的话,应该怎么样调用内置函数???
期望 ...

c大不是已经写了吗。。。左对齐和右对齐不同  右对齐是加多少个空格就可以了  左对齐的话是看总长度是多少

比如set a=abc  那变量a值长度为3  想左对齐左边加2个空格的话  那最后变量a总长度应该是5  也就是应该写成下面这样子

call Fn.0 0 "%5s" "%a%"

需要注意的是使用set设置变量值时   值不能以空格开头  所以想将对齐后的值赋给变量的话需要改下

call Fn.0 0 "%4s" "%a%" | set a=\x20

实际使用时需要用 echo -e %a% 输出变量a的值

\x20会被扩展为空格  再加上call Fn.0扩展了一个空格出来  变量a输出时实际长度就是5  达到了左对齐的要求
回复

使用道具 举报

8#
发表于 2013-5-21 17:09:16 | 只看该作者
set命令再加个参数吧:set /e a=\x20 表示变量a的值是一个空格字符。
回复

使用道具 举报

9#
 楼主| 发表于 2013-5-21 17:48:03 | 只看该作者
sratlf 发表于 2013-5-21 16:09
c大不是已经写了吗。。。左对齐和右对齐不同  右对齐是加多少个空格就可以了  左对齐的话是看总长度是多少 ...

感谢各位的指导,好像我有点愚笨,遇到这么一个问题:
把下面一段代码:
!BAT
set h=abcd
call Fn.0 0 "%11s" "%h%"
exit
写成一个文件在grub的命令行当中运行,怎么都显示不出正确的结果?
但我命令行当中手动输入call Fn.0 0 "%11s" "%h%"
就是正常的!
我在哪儿有出错了,我试了好多次!
回复

使用道具 举报

10#
发表于 2013-5-21 17:50:45 | 只看该作者
zbkh 发表于 2013-5-21 17:48
感谢各位的指导,好像我有点愚笨,遇到这么一个问题:
把下面一段代码:
!BAT

批处理中%会自动处理掉  需要用%%才行  也就是第三行改为

call Fn.0 0 "%%11s" "%h%"
回复

使用道具 举报

11#
 楼主| 发表于 2013-5-21 19:01:59 | 只看该作者
sratlf 发表于 2013-5-21 17:50
批处理中%会自动处理掉  需要用%%才行  也就是第三行改为

call Fn.0 0 "%%11s" "%h%"

恩,我试了,对的!但不解的是:call Fn.0 0 "%-6s" "%a%" 这个没有加两个%%变成:call Fn.0 0 "%%-6s" "%a%"  也是可以的?
回复

使用道具 举报

12#
发表于 2013-5-22 09:20:40 | 只看该作者
本帖最后由 zhaohj 于 2013-5-22 09:22 编辑

不用内部函数,改成
set a=ABC
set n=3
:var
echo -e \x20 | set a=%a%
set /a n=%n%-1
if not "%n%"=="0"  goto :var

Snap0.jpg (117.07 KB, 下载次数: 45)

Snap0.jpg
回复

使用道具 举报

13#
 楼主| 发表于 2013-5-22 11:59:31 | 只看该作者
zhaohj 发表于 2013-5-22 09:20
不用内部函数,改成
set a=ABC
set n=3

恩,也可以,谢谢!
回复

使用道具 举报

14#
发表于 2013-5-23 16:21:18 | 只看该作者
麻烦问一下 sratlf 或 chenall
G4D 可以 map NTFS 分区上的整理连续的 img 或 vhd 吗? 不要 --mem.
我的 img 文件可以用 --mem map, 但不能直接 map.
谢谢了.
回复

使用道具 举报

15#
发表于 2013-5-23 16:41:24 | 只看该作者
zzz654321 发表于 2013-5-23 16:21
麻烦问一下 sratlf 或 chenall
G4D 可以 map NTFS 分区上的整理连续的 img 或 vhd 吗? 不要 --mem.
我的 ...


只要是连续存放的肯定可以,不可以一般都不是连续存放的.
用blocklist 命令测试一下就知道是否连续存放了.
回复

使用道具 举报

16#
发表于 2013-5-23 16:55:07 | 只看该作者
zzz654321 发表于 2013-5-23 16:21
麻烦问一下 sratlf 或 chenall
G4D 可以 map NTFS 分区上的整理连续的 img 或 vhd 吗? 不要 --mem.
我的 ...

不能直接map是什么错误  是grub提示的错误  还是启动img后出现的错误  错误类型需要说明白了
回复

使用道具 举报

17#
发表于 2013-5-23 17:25:20 | 只看该作者
本帖最后由 zzz654321 于 2013-5-23 17:34 编辑
chenall 发表于 2013-5-23 16:41
只要是连续存放的肯定可以,不可以一般都不是连续存放的.
用blocklist 命令测试一下就知道是否连续存放 ...


但我在 winpe 下用 Defraggler WContig 都检查过, 没有碎片?
不知道怎么解释了. :(

blocklist 提示
(hd0,5)xxx+xxx 具体数字记不清了,
回复

使用道具 举报

18#
发表于 2013-5-23 17:26:11 | 只看该作者
本帖最后由 zzz654321 于 2013-5-23 17:33 编辑
sratlf 发表于 2013-5-23 16:55
不能直接map是什么错误  是grub提示的错误  还是启动img后出现的错误  错误类型需要说明白了


可以 map, 但 chainloader 时提示分区信息不对

刚才重新启动了一下,
root (hd0,0) 时, 提示 error 25: 磁盘读取错误

菜单项如下
title RAMOS-XpSP3Tang
        map (hd0,5)/MiniPE/_ISOs/RAMOS-XpSP3Tang.img (hd0)+1
        map (hd0) (hd3)
        map --hook
        root (hd0,0)
        chainloader /ntldr

如果在 map (hd0,5)/MiniPE/_ 里面添加 --mem, 就可以正常进 ramos 系统
回复

使用道具 举报

19#
发表于 2013-5-23 17:41:59 | 只看该作者
zzz654321 发表于 2013-5-23 17:26
可以 map, 但 chainloader 时提示分区信息不对

刚才重新启动了一下,


这个是你的用法和镜像格式问题吧

有加--mem参数时映射到(hdx)如果没有分区表会自动添加.

如果你没有分区表想直接map,只能map到(fdx),否则肯定会有问题,因为找不到分区表.

回复

使用道具 举报

20#
发表于 2013-5-23 17:55:25 | 只看该作者
本帖最后由 zzz654321 于 2013-5-23 18:00 编辑
chenall 发表于 2013-5-23 17:41
这个是你的用法和镜像格式问题吧

有加--mem参数时映射到(hdx)如果没有分区表会自动添加.


谢谢百忙中解答我的问题, 重启后测试了, 确实 img 文件 可以 map 到 (fdx),
这种情况下可以构造一个虚拟的分区表, 然后map 到 (hdx) 吗?
不知道 --in-situ 这个选项可以达成不?
回复

使用道具 举报

21#
发表于 2013-5-23 18:00:29 | 只看该作者
zzz654321 发表于 2013-5-23 17:55
谢谢百忙中解答我的问题, 重启后测试了, 确实 img 文件 可以 map 到 (fdx),
这种情况下可以构造一个虚拟 ...

目前不行(因为没有人去解决),我也不懂.

因为直接映射读取的是硬盘上的数据,我们不能随意更改.

但--mem不一样,数据是在内存中的,修改很方便.
回复

使用道具 举报

22#
发表于 2013-5-23 18:03:18 | 只看该作者
chenall 发表于 2013-5-23 18:00
目前不行(因为没有人去解决),我也不懂.

因为直接映射读取的是硬盘上的数据,我们不能随意更改.

谢谢了, 下班了, 我回家再研究一下, 希望以后可以多交流.
回复

使用道具 举报

23#
发表于 2013-5-24 11:10:17 | 只看该作者
本帖最后由 zzz654321 于 2013-5-24 12:35 编辑

今天有一些进展了, 但还没有成功!
我有一个 XPsp3 的 ramos IMG 文件, 采用 NTFS 压缩存储, 无分区; 根目录下文件不压缩!

        map --mem (hd0,5)/MiniPE/_ISOs/RAMOS-XpSP3Tang.img (hd0)+1
        map (hd0) (hd3)
        map --hook
        root (hd0,0)
        chainloader /ntldr

上面的菜单可以启动 ramos

今天, 结合其它人的经验, 写了下面的菜单

        map --mem (hd0,0)/boot/grub/FIRADISK-0.0.1.24.gz (fd1)
        map --mem (md)0x200+800 (fd0)
        map --hook
        dd if=(fd1) of=(fd0) count=1
        set img=/MiniPE/_ISOs/RAMOS-XpSP3Tang.img
        find --set-root %img%
        map %img% (hd0)
        map (hd0) (hd3)
        map --mem (md)0x200+4 (99)
        map --hook
        echo [FiraDisk] > (99)+1
        echo StartOptions=cdrom,vmem=find:%img%; >> (99)+1
        root (hd0)
        chainloader /ntldr

去掉 chainloader /ntldr 这句, cat (hd0)/boot.ini 可以显示正确的内容
      chainloader /ntldr    boot 后, 出现下面的错误:
Invalid BOOT.INI file
Booting from c:\windows\
NTDETECT failed

我估计是 img 里面没有分区造成的, 现在再用 DG 做个有分区的再测试看看


刚才用 DG 做了个 img 文件, 然后把原来的 img 里面的所有文件导入进去,
结果 map 不 --mem 时, 可以启动, 蓝屏 7B,
我以为是其中的 firadisk-driver 是 0.0.1.16 版本的原因, 替换了驱动, 还是一样的错误.
这个新的 img 文件 --mem 加载启动可以成功进入桌面.
希望那位大侠可以帮忙分析一下, 谢谢
回复

使用道具 举报

24#
发表于 2013-5-24 14:09:05 | 只看该作者
chenall 发表于 2013-5-23 18:00
目前不行(因为没有人去解决),我也不懂.

因为直接映射读取的是硬盘上的数据,我们不能随意更改.

今天有一些进展了, 但还没有成功!
我有一个 XPsp3 的 ramos IMG 文件, 采用 NTFS 压缩存储, 无分区; 根目录下文件不压缩!

        map --mem (hd0,5)/MiniPE/_ISOs/RAMOS-XpSP3Tang.img (hd0)+1
        map (hd0) (hd3)
        map --hook
        root (hd0,0)
        chainloader /ntldr

上面的菜单可以启动 ramos

今天, 结合其它人的经验, 写了下面的菜单

        map --mem (hd0,0)/boot/grub/FIRADISK-0.0.1.24.gz (fd1)
        map --mem (md)0x200+800 (fd0)
        map --hook
        dd if=(fd1) of=(fd0) count=1
        set img=/MiniPE/_ISOs/RAMOS-XpSP3Tang.img
        find --set-root %img%
        map %img% (hd0)
        map (hd0) (hd3)
        map --mem (md)0x200+4 (99)
        map --hook
        echo [FiraDisk] > (99)+1
        echo StartOptions=cdrom,vmem=find:%img%; >> (99)+1
        root (hd0)
        chainloader /ntldr

去掉 chainloader /ntldr 这句, cat (hd0)/boot.ini 可以显示正确的内容
      chainloader /ntldr    boot 后, 出现下面的错误:
Invalid BOOT.INI file
Booting from c:\windows\
NTDETECT failed

我估计是 img 里面没有分区造成的, 现在再用 DG 做个有分区的再测试看看


刚才用 DG 做了个 img 文件, 然后把原来的 img 里面的所有文件导入进去,
结果 map 不 --mem 时, 可以启动, 蓝屏 7B,
我以为是其中的 firadisk-driver 是 0.0.1.16 版本的原因, 替换了驱动, 还是一样的错误.
这个新的 img 文件 --mem 加载启动可以成功进入桌面.
希望可以帮忙分析一下, 谢谢
回复

使用道具 举报

25#
发表于 2013-5-24 14:44:38 | 只看该作者
firadisk 有加--mem和没有加mem的使用方法是不一样的,具体的自己论坛找一下..
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-9-22 18:23

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表