python: iterate through two directories with the same structure. If there is a file whose name contains '*.csv', run the bash command `cmd1 file_path_in_dir1 file_path_in_dir2`.
Here is an example Python code that iterates through two directories with the same structure and runs a bash command on files whose names contain ```*.csv```:
```python
import os

dir1 = '/path/to/dir1'
dir2 = '/path/to/dir2'
cmd1 = 'your bash command here {} {}'

for root, dirs, files in os.walk(dir1):
    for name in files:
        if name.endswith('.csv'):
            file_path_in_dir1 = os.path.join(root, name)
            file_path_in_dir2 = os.path.join(dir2, os.path.relpath(file_path_in_dir1, dir1))
            os.system(cmd1.format(file_path_in_dir1, file_path_in_dir2))
```
Explanation:

```os.walk(dir1)``` iterates through all files and directories in ```dir1``` and its subdirectories.
```os.path.join(root, name)``` constructs the full path of the file in ```dir1```.
```os.path.join(dir2, os.path.relpath(file_path_in_dir1, dir1))``` constructs the corresponding path of the file in ```dir2``` by computing the relative path of the file in ```dir1 ``` and then joining it with ```dir2```.
```if name.endswith('.csv')``` checks if the file name ends with .csv.
```os.system(cmd1.format(file_path_in_dir1, file_path_in_dir2))``` runs the bash command ```cmd1``` with the file paths as arguments.
Note that ```os.system``` runs the command in a subshell, so you can use any valid bash command in ```cmd1```.
Do the same for Windows PowerShell, please.
Here's the PowerShell equivalent:
```
$dir1 = 'C:\path\to\dir1'
$dir2 = 'C:\path\to\dir2'
$cmd1 = 'your Powershell command here {} {}'

Get-ChildItem -Path $dir1 -Recurse | Where-Object { $_.Extension -eq '.csv' } | ForEach-Object {
    $file1 = $_.FullName
    $file2 = Join-Path -Path $dir2 -ChildPath $file1.Substring($dir1.Length)
    & $cmd1 -f $file1, $file2
}
```
Explanation:

Get-ChildItem -Path $dir1 -Recurse recursively lists all files and directories in dir1
Where-Object { $_.Extension -eq '.csv' } filters the list to only .csv files
ForEach-Object loops over the filtered list
$_ represents each .csv file
$_.FullName gets the full path of the current .csv file
Join-Path constructs the path in dir2
$file1.Substring($dir1.Length) gets the relative path of the file in dir1
& invokes a subprocess to run the command $cmd1 with the file paths as arguments