无忧启动论坛

标题: 求关于在一个字符串末尾添加n个空格的批处理代码? [打印本页]

作者: zbkh    时间: 2013-5-19 01:53
标题: 求关于在一个字符串末尾添加n个空格的批处理代码?
求关于在一个字符串末尾添加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

还有没有其他写法??
作者: chenall    时间: 2013-5-19 08:13
本帖最后由 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%"
作者: zbkh    时间: 2013-5-19 22:25
本帖最后由 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=


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

哦,对了,关于内置函数,有相关的学习资料吗?我想看看,学学!
作者: chenall    时间: 2013-5-20 09:05
内部函数调用方法.
call Fn.N 参数1 参数2 参数3....最多9个.
N是对应函数编号.

懂得C语言的,自己看grub4dos.h文件就明白了...
作者: zbkh    时间: 2013-5-20 09:34
本帖最后由 zbkh 于 2013-5-20 10:32 编辑
chenall 发表于 2013-5-20 09:05
内部函数调用方法.
call Fn.N 参数1 参数2 参数3....最多9个.
N是对应函数编号.


恩,谢谢! 不过不好意思,我找了找,没发现grub4dos.h,麻烦chenall告知这个文件在什么地方可以找到!谢谢!
作者: zbkh    时间: 2013-5-21 15:47
chenall 发表于 2013-5-19 08:13
内置printf函数
在变量a后面添加3个空格,要N个空格就Ns
call Fn.0 0 "%a%%3s" | set a=


你好,有点不太好意思!还想请教如果是左边补空格,右边对齐的话,应该怎么样调用内置函数???
期望chenall能够列举几个在批处理当中经常有用到的内置函数用法举例,我想很多人都会非常开心!呵呵!
作者: sratlf    时间: 2013-5-21 16:09
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  达到了左对齐的要求
作者: zhaohj    时间: 2013-5-21 17:09
set命令再加个参数吧:set /e a=\x20 表示变量a的值是一个空格字符。
作者: zbkh    时间: 2013-5-21 17:48
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%"
就是正常的!
我在哪儿有出错了,我试了好多次!
作者: sratlf    时间: 2013-5-21 17:50
zbkh 发表于 2013-5-21 17:48
感谢各位的指导,好像我有点愚笨,遇到这么一个问题:
把下面一段代码:
!BAT

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

call Fn.0 0 "%%11s" "%h%"
作者: zbkh    时间: 2013-5-21 19:01
sratlf 发表于 2013-5-21 17:50
批处理中%会自动处理掉  需要用%%才行  也就是第三行改为

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

恩,我试了,对的!但不解的是:call Fn.0 0 "%-6s" "%a%" 这个没有加两个%%变成:call Fn.0 0 "%%-6s" "%a%"  也是可以的?
作者: zhaohj    时间: 2013-5-22 09:20
本帖最后由 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, 下载次数: 50)

Snap0.jpg

作者: zbkh    时间: 2013-5-22 11:59
zhaohj 发表于 2013-5-22 09:20
不用内部函数,改成
set a=ABC
set n=3

恩,也可以,谢谢!
作者: zzz654321    时间: 2013-5-23 16:21
麻烦问一下 sratlf 或 chenall
G4D 可以 map NTFS 分区上的整理连续的 img 或 vhd 吗? 不要 --mem.
我的 img 文件可以用 --mem map, 但不能直接 map.
谢谢了.
作者: chenall    时间: 2013-5-23 16:41
zzz654321 发表于 2013-5-23 16:21
麻烦问一下 sratlf 或 chenall
G4D 可以 map NTFS 分区上的整理连续的 img 或 vhd 吗? 不要 --mem.
我的 ...


只要是连续存放的肯定可以,不可以一般都不是连续存放的.
用blocklist 命令测试一下就知道是否连续存放了.
作者: sratlf    时间: 2013-5-23 16:55
zzz654321 发表于 2013-5-23 16:21
麻烦问一下 sratlf 或 chenall
G4D 可以 map NTFS 分区上的整理连续的 img 或 vhd 吗? 不要 --mem.
我的 ...

不能直接map是什么错误  是grub提示的错误  还是启动img后出现的错误  错误类型需要说明白了
作者: zzz654321    时间: 2013-5-23 17:25
本帖最后由 zzz654321 于 2013-5-23 17:34 编辑
chenall 发表于 2013-5-23 16:41
只要是连续存放的肯定可以,不可以一般都不是连续存放的.
用blocklist 命令测试一下就知道是否连续存放 ...


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

blocklist 提示
(hd0,5)xxx+xxx 具体数字记不清了,
作者: zzz654321    时间: 2013-5-23 17:26
本帖最后由 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 系统
作者: chenall    时间: 2013-5-23 17:41
zzz654321 发表于 2013-5-23 17:26
可以 map, 但 chainloader 时提示分区信息不对

刚才重新启动了一下,


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

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

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


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

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


谢谢百忙中解答我的问题, 重启后测试了, 确实 img 文件 可以 map 到 (fdx),
这种情况下可以构造一个虚拟的分区表, 然后map 到 (hdx) 吗?
不知道 --in-situ 这个选项可以达成不?
作者: chenall    时间: 2013-5-23 18:00
zzz654321 发表于 2013-5-23 17:55
谢谢百忙中解答我的问题, 重启后测试了, 确实 img 文件 可以 map 到 (fdx),
这种情况下可以构造一个虚拟 ...

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

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

但--mem不一样,数据是在内存中的,修改很方便.
作者: zzz654321    时间: 2013-5-23 18:03
chenall 发表于 2013-5-23 18:00
目前不行(因为没有人去解决),我也不懂.

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

谢谢了, 下班了, 我回家再研究一下, 希望以后可以多交流.
作者: zzz654321    时间: 2013-5-24 11:10
本帖最后由 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 加载启动可以成功进入桌面.
希望那位大侠可以帮忙分析一下, 谢谢
作者: zzz654321    时间: 2013-5-24 14:09
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 加载启动可以成功进入桌面.
希望可以帮忙分析一下, 谢谢
作者: chenall    时间: 2013-5-24 14:44
firadisk 有加--mem和没有加mem的使用方法是不一样的,具体的自己论坛找一下..




欢迎光临 无忧启动论坛 (http://bbs.wuyou.net/) Powered by Discuz! X3.3