Chinaunix首页 | 论坛 | 博客
  • 博客访问: 86959
  • 博文数量: 13
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 320
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-06 18:50
文章分类

全部博文(13)

文章存档

2011年(1)

2009年(6)

2008年(6)

我的朋友

分类: WINDOWS

2008-07-18 19:49:13

PowerShell的cmdlet都带有一个`-WhatIf',顾名思义,cmdlet后加上这个转换后,并不会实际起作用,而会告诉你实施这个命令后会发生什么,这样当你进行某些不确定,可能带来危害的命令操作前,可以加上`-WhatIf'转换先评估,确定后再进行。

比如,我想重命名当前目录下所有文件,把其中的空格变为下划线'_'

PS D:test
$ ls -name
1 space space.txt
10 space space.txt
2 space space.txt
3 space space.txt
4 space space.txt
5 space space.txt
6 space space.txt
7 space space.txt
8 space space.txt
9 space space.txt

我想的Shell步骤如下,但不能确定是否正确,如果
ls | % { Rename-Item $_ ($_.name -replace " ","_")

这时,-WhatIf就可以派上用场了,让我们来看看,这个Shell步骤到底会做什么么?
PS D:test
$ ls | % { Rename-Item $_ ($_.name -replace " ","_") -WhatIf }
What if: Performing operation "Rename File" on Target "Item: D:test space spa
ce.txt Destination: D:test_space_space.txt".
What if: Performing operation "Rename File" on Target "Item: D:test space sp
ace.txt Destination: D:test_space_space.txt".
What if: Performing operation "Rename File" on Target "Item: D:test space spa
ce.txt Destination: D:test_space_space.txt".
What if: Performing operation "Rename File" on Target "Item: D:test space spa
ce.txt Destination: D:test_space_space.txt".
What if: Performing operation "Rename File" on Target "Item: D:test space spa
ce.txt Destination: D:test_space_space.txt".
What if: Performing operation "Rename File" on Target "Item: D:test space spa
ce.txt Destination: D:test_space_space.txt".
What if: Performing operation "Rename File" on Target "Item: D:test space spa
ce.txt Destination: D:test_space_space.txt".
What if: Performing operation "Rename File" on Target "Item: D:test space spa
ce.txt Destination: D:test_space_space.txt".
What if: Performing operation "Rename File" on Target "Item: D:test space spa
ce.txt Destination: D:test_space_space.txt".
What if: Performing operation "Rename File" on Target "Item: D:test space spa
ce.txt Destination: D:test_space_space.txt".

不错,看上去这个重命名步骤没问题,符合预期。接下来,就可以去掉`-WhatIf',进行实际操作了。
PS D:test
$ ls | % { Rename-Item $_ ($_.name -replace " ","_") }
PS D:test
$ ls -name
10_space_space.txt
1_space_space.txt
2_space_space.txt
3_space_space.txt
4_space_space.txt
5_space_space.txt
6_space_space.txt
7_space_space.txt
8_space_space.txt
9_space_space.txt

而在Linux shell中,并没有这样的测试机制,所以在进行命令操作前,一定要谨慎行事。相同的重命名例子,在bash中,如果要进行测试,就比较困难了,我能做到的仅仅是验证对文件名进行的文本操作是否正确:

for f in *.txt; do new=`echo "$f" | sed 's/ /_/g'`; echo "$f will be renamed to $new";'done

但这个并不是最终结果,因为实际重命名的mv过程并没有测试,比如mv过程中带有空格的$f没有被双引号引用,就会出错,但这一步并没法测试。

上面所说的只是一个很简单的例子,如果碰到更复杂,出错后更具破坏性的情况,-WhatIf的优点就更明显了。

阅读(666) | 评论(0) | 转发(0) |
0

上一篇:写给女人的

下一篇:蚂蚁过杆的问题

给主人留下些什么吧!~~