分类: 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的优点就更明显了。