Este script deve fazer o trabalho:
dir | %{
$id = $_.Name.SubString(0,8);
if(-not (Test-Path $id)) {mkdir $id};
mv $_ "$id\$_";}
Explicação:
foreach no diretório (% é um alias para foreach):
- Obtenha o id dos 9 primeiros caracteres. Observe que a variável $ _ é uma variável automática preenchida pelo powershell que representa o arquivo atual. A propriedade Name do objeto retorna um objeto .NET String que possui uma função de membro SubString que você pode usar para retornar a parte do nome de arquivo em que está interessado.
- Verifique se o diretório "id" já existe. Se não, crie-o (mkdir é um alias para New-Item).
- Em seguida, mova o arquivo para o diretório (mv é um alias para Move-Item). Observe que, quando o PowerShell vê uma variável dentro de uma cadeia com aspas duplas, ela automaticamente expande seu valor para a string resultante.
Observe que o exemplo que forneço pressupõe que você o esteja executando a partir do diretório onde seus arquivos estão.